linux 内核模块开发,Linux内核模块开发(笔记)
Linux內(nèi)核模塊開發(fā)(筆記)
作者:扶凱 來源: 扶凱 時(shí)間:2011-11-21 00:21:11 人氣:249 評(píng)論:0
標(biāo)簽: 內(nèi)核
個(gè)人筆記。。在不放過來都快找不到了。有空還得好好整理一下了。
調(diào)試方法
printk() 是用來調(diào)試內(nèi)核最常用的一種技術(shù),他打印的信息會(huì)輸出在 dmesg 中,所以調(diào)試前最好使用 dmesg -c 來清掉以前 dmesg 的信息。 使用的例子如下:
printk(KERN_DEBUG "Here i am:%s:%d\n", FUNCTION, LINE);
可以打印的級(jí)別可以看看 linux/kernel.h 中的定義。
strace 這個(gè)命令超級(jí)強(qiáng)大,可以顯示程序所有的系統(tǒng)調(diào)用,還可以顯示調(diào)用時(shí)使用的參數(shù)。 但這個(gè)時(shí)候不需要麻煩的配置就可以直接使用,但不能象
gdb 調(diào)試 c 程序一樣,所以內(nèi)核為我們提供了一個(gè) kdb ,可以支持動(dòng)態(tài)修改變量,斷點(diǎn)設(shè)置,單步執(zhí)行
kernel oops messages
這是內(nèi)核開發(fā)時(shí)常會(huì)出現(xiàn)的一個(gè)錯(cuò)誤信息。主要原因是由于 NULL 指針引用,和其它不正常的指針操作引起的。這時(shí) oops 會(huì)顯示故障時(shí)的處理器信息, 模塊 CPU 寄存器內(nèi)容,頁描述符表的位置之類的信息。
內(nèi)核模塊簡(jiǎn)單介紹
模塊是工作在內(nèi)核空間的
模塊實(shí)際是目標(biāo)文件(由函數(shù)和數(shù)據(jù)結(jié)構(gòu)組成),不象普通程序有個(gè)鏈接的過程,不能獨(dú)立運(yùn)行,只能在運(yùn)行時(shí)鏈接到系統(tǒng)做為內(nèi)核的一部分運(yùn)行,從面擴(kuò)展內(nèi)核功
能
內(nèi)核模塊會(huì)占用內(nèi)核空間的內(nèi)存,所以會(huì)影響內(nèi)存使用,它還會(huì)修改內(nèi)核中的一些內(nèi)容,所以容易造成系統(tǒng)掛掉。在內(nèi)核中需要維護(hù)符號(hào)表。并且內(nèi)核之間有依賴
性。
最簡(jiǎn)單的內(nèi)核模塊
注:如果是 redhat 安裝的話,需要安裝 kernel-devel 才能寫內(nèi)核模塊,如果是自己編譯內(nèi)核,記的不要?jiǎng)h除源碼,不然沒法開發(fā)模塊。
放個(gè)編譯上面模塊的 Makefile
給 Makefile 放到上面 hello.c 的相同的目錄中(如果上面寫的模塊代碼叫 hello.c 的話)。然后使用 make 就能編譯了。
insmod lsmod rmmod
調(diào)用 insmod 時(shí)會(huì)給需要的模塊加載進(jìn)內(nèi)核,會(huì)給 ko 的文件以目標(biāo)代碼加載。裝載時(shí)會(huì)調(diào)用 module_init 指定的函數(shù)。退出也調(diào)用相應(yīng)的 module_exit.
lsmod 可以顯示你寫的模塊,其實(shí)是讀 /proc/modules 。接下來我寫寫怎么樣自己通過內(nèi)核來建 proc 文件。
模塊加載參數(shù)
如果在模塊加載時(shí),想指定參數(shù),也提供了相應(yīng)的頭文件
這樣以后,直接在內(nèi)核模塊內(nèi)使用 test 的變量就行了。
模塊的信息
在程序中可以為模塊加一些描述,發(fā)行版權(quán)聲明,和作者。
模塊的符號(hào)導(dǎo)出
在 Perl 中,模塊是可以導(dǎo)出變量和方法到其它的模塊中的。在 Linux 內(nèi)核中也有這樣的方法。
這二個(gè)可以導(dǎo)出指定的全局變量,也可以是方法。這個(gè)要加載 的頭文件,不要忘記了。
其它的模塊要使用這個(gè),直接使用 extern void name(void); 就可以使用了。這些導(dǎo)出的函數(shù)只能內(nèi)核和內(nèi)核模塊使用。不能用戶調(diào)用,可以由 /proc/kallsyms 來查看導(dǎo)出的變量和方法
實(shí)例
寫個(gè)內(nèi)核模塊,通過 proc 可以見到一些信息,通過 proc 的讀和寫的功能。來實(shí)現(xiàn)設(shè)置和讀取信息。
proc 介紹
proc 是一個(gè)非常方便的用來動(dòng)態(tài)的向 Linux 內(nèi)核加入和禁用代碼的一個(gè)方法。
proc/sys 中是用來配置內(nèi)核的參數(shù),可以通過 sysctl -w key=value
象普通文件可以支持 open,read,write,close
例如
讀
寫
proc 的功能實(shí)現(xiàn)
proc 在 c 中是一個(gè)結(jié)構(gòu)體來實(shí)現(xiàn)的,是 struct proc_dir_entry 。它可以給讀寫綁定到特定的函數(shù)上。然后通過別人對(duì) proc 中文件的操作來觸發(fā)和回調(diào)相應(yīng)的綁定的函數(shù)。
read_proc 和 write_proc 是這個(gè)結(jié)構(gòu)體的成員,也是一種結(jié)構(gòu)體。函數(shù)就注冊(cè)在這個(gè)上面。有興趣的同學(xué)可以看看 include/linux/proc_fs.h 中的 read_proc_t 和 write_proc_t 的定義。
實(shí)現(xiàn)起來也簡(jiǎn)單。
在這的 create_proc_entery 會(huì)返回一個(gè) proc_dir_entry 的結(jié)構(gòu)體的引用。失敗就是 NULL 。
這樣,當(dāng)用戶空間進(jìn)行 read 的系統(tǒng)調(diào)用時(shí),如使用 cat proc 中的內(nèi)容時(shí)。內(nèi)核會(huì)調(diào)用注冊(cè)到 read_proc 上的這個(gè) my_read_proc 來實(shí)現(xiàn)的.
總結(jié)
以上是生活随笔為你收集整理的linux 内核模块开发,Linux内核模块开发(笔记)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python变量类型之间转换_Pytho
- 下一篇: linux将命令的执行结果赋给变量