原创 Linux內核中ioremap映射的透徹理解

幾乎每一種外設都是通過讀寫設備上的寄存器來進行的,通常包括控制寄存器、狀態寄存器和數據寄存器三大類,外設的寄存器通常被連續地編址。根據CPU體系結構的不同,CPU對IO端口的編址方式有兩種:   (1)I/O映射方式(I/O-mapped

原创 linux 添加系統調用的方法(arm架構)

在linux中,系統調用是非常重要的一個機制。那麼,如何才能在自己的代碼環境中增加一項系統調用呢? 首先,以“open”系統調用爲例,看看系統調用都需要哪些支持: 1 open系統調用的定義在文件<kernel/fs/open.c>中:

原创 strtol的用法

該函數可用於將ASCII碼轉換爲各種進制的數。   unsigned long value = strtol("0x12345678",NULL,16); 第一個參數用於設定待轉換的字符串(會自動識別0x),第二個參數和起始位置有關,第三

原创 內核通知鏈機制的原理及實現

轉自:http://blog.sina.com.cn/s/blog_6683e49d0100tovr.html 一、概念:     大多數內核子系統都是相互獨立的,因此某個子系統可能對其它子系統產生的事件感興趣。爲了滿足這個需求,也即是讓

原创 使用__builtin_return_address獲得程序運行棧情況

項目中遇到了一個多線程的問題,系統總是莫名其妙的崩潰,而且bug不可重現,後來發現是接收到某些信號的問題,於是乎就加入了信號處理函數,想獲得是什麼地方觸發了這個信號,因爲感覺多線程調試比較麻煩,於是就想到了使用利用__builtin_

原创 創建系統時間命名的文件夾

@echo off set my_date=%date:~0,4%%date:~5,2%%date:~8,2% set my_time=%time:~0,2%%time:~3,2%%time:~6,2% set dir_name=%my_

原创 工作隊列的使用

由於在中斷中不能進行阻塞型操作,而有時候需要在中斷時讀取某些內存單元或寄存器的值,此時可以考慮利用工作隊列來實現。 工作隊列的定義: 工作隊列是將操作延期的一種手段。因爲他們是通過守護進程在用戶上下文執行,函數可以睡眠任意長的時間,這與內

原创 Linux中的工作隊列

 轉自 http://tanatseng.blog.163.com/blog/static/174991629201132734828701/ 工作隊列一般用來做滯後的工作,比如在中斷裏面要做很多事,但是比較耗時,這時就可以把耗時的工作

原创 利用mmc_test.c研究mmc模塊

        近日開始研究mmc模塊。老是看代碼不免睏意來襲,爲了克服睏意,可以通過一些小的試驗來加深對該模塊的理解。         第一步:         首先,自己創建了一個小的測試模塊,通過獲取mmc模塊初始化時sdhci_h

原创 讓vim顯示空格,及tab字符 vim 多行註釋

1、顯示 TAB 鍵 文件中有 TAB 鍵的時候,你是看不見的。要把它顯示出來: :set list 現在 TAB 鍵顯示爲 ^I,而 $顯示在每行的結尾,以便你能找到可能會被你忽略的空白字符在哪裏。 這樣做的一個缺點是在有很多 TAB

原创 linux中通過等待隊列來實現阻塞

在linux驅動程序中,阻塞進程可以通過使用等待隊列來實現(等待隊列還可以用於“實現內核中異步事件通知機制”以及用於“同步對系統資源的訪問”)。 1 等待隊列頭的定義及初始化 等待隊列頭的定義: struct __wait_queue_

原创 axi總線介紹

AXI(Advanced eXtensible Interface)是一種總協議,該協議是ARM公司提出的AMBA(Advanced Microcontroller Bus Architecture)3.

原创 解密module_init

在Linux底下寫過driver模塊的對這個宏一定不會陌生。module_init宏在MODULE宏有沒有定義的情況下展開的內容是不同的,如果這個宏沒有定義,基本上表明閣下的模塊是要編譯進內核的(obj-y)。 1.在MODULE沒有定義

原创 通過mmap將連續物理地址映射到用戶空間

        由於MMU對用戶空間的內存採用頁式管理,用戶空間的內存都是虛擬的,只有當真正寫入物理內存時,系統纔會判斷是否爲該虛擬內存分配物理內存,如果未分配就會觸發缺頁中斷,然後分配一整頁的內存給應用程序。所以用戶空間的內存表面上連續

原创 __builtin_constant_p(x)

gcc的內建函數,當x爲常數時返回1, x爲變量時返回0. 不過這並不完全準確。 linux kernel的代碼中經常有這樣的代碼: if (__builtin_constant_p(x)) { do1; } else { do2; }