Linux内核模块编程入门
生活随笔
收集整理的這篇文章主要介紹了
Linux内核模块编程入门
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
針對2.6內(nèi)核的Linux系統(tǒng),需要你的機(jī)器上已經(jīng)安裝了kernel-devel這個包,也就是編譯模塊所必須的東西:內(nèi)核的頭文件和一些Makefile。
一,Hello?World程序:
[code:1:fbc83fc10a]/*file: hello.c*/
#ifndef?__KERNEL__
????????#define?__KERNEL__
#endif
#ifndef?MODULE
????????#define?MODULE
#endif
#include?<linux/init.h>
#include?<linux/module.h>
#include?<linux/kernel.h>
static?int?hello_init(void)
{
????????printk(KERN_ALERT?"Hello,?The?fucking?crazy?world\n");
????????return?0;
}
static?void?hello_exit(void)
{
????????printk(KERN_ALERT?"Bye,?The?fucking?crazy?world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("albcamus?<albcamus@163.com>");[/code:1:fbc83fc10a]
2.6內(nèi)核的kbuild子系統(tǒng)跟2.4相比有本質(zhì)的改變。我們下面嘗試兩種方式編譯這個程序:
1,?你可以在本目錄下這樣寫一個Makefile
[code:1:fbc83fc10a]obj-m?:=?hell.o
clean:
????????rm?-rf?*.o?.*.cmd?*.ko?*.mod.c?.tmp_versions[/code:1:fbc83fc10a]
然后用這樣的命令行編譯:
make?-C?/lib/modules/`uname?-r`/build?M=`pwd`?modules
這時ls一下,就能看到生成了很多文件,其中hello.ko就是我們需要的內(nèi)核模塊。
2,?專業(yè)點(diǎn)兒,Makefile這樣寫:
[code:1:fbc83fc10a]obj-m?:=?hello.o
KERNELBUILD?:=?/lib/modules/`uname?-r`/build
default:
????????make?-C?$(KERNELBUILD)?M=$(shell?pwd)?modules
clean:
????????rm?-rf?*.o?.*.cmd?*.ko?*.mod.c?.tmp_versions[/code:1:fbc83fc10a]
然后只要make一下就可以了。
插入模塊用insmod命令:
insmod?./hello.ko
這時候大家可能會問:為什么我的屏幕上沒有見到輸出?這個是console的日志記錄級別和你printk消息時指定的級別(本例中指定為KERN_ALERT,為次高,僅次于KERN_EMERG)決定的。無論如何,你可以tail?或者cat看看系統(tǒng)日志的最后幾行,系統(tǒng)日志一般為/var/log/messages,或者直接用dmesg命令,肯定能看到輸出了。
二,頭文件問題。
C程序員都知道,要使用某個外部的函數(shù),應(yīng)當(dāng)#include某個頭文件,這個頭文件包含了那個函數(shù)的原型(prototype)。內(nèi)核的頭文件在include/下,其中include/asm是個符號鏈接,指向你所用內(nèi)核的具體的體系結(jié)構(gòu)目錄,比方說我的系統(tǒng)是i386的,那么include/asm就指向include/asm-i386?。
內(nèi)核編程中我們不能鏈接libc庫,不能使用libc庫中的函數(shù),所以很有些麻煩。一些重要的函數(shù),象strcpy/strcmp/snprintf等,kernel也為我們實(shí)現(xiàn)并導(dǎo)出(export)了,而我們需要#include相關(guān)的頭文件,在include/linux和include/asm中,你需要自己尋找你所要使用的函數(shù)在哪個頭文件中聲明,并將其#include進(jìn)來。
一,Hello?World程序:
[code:1:fbc83fc10a]/*file: hello.c*/
#ifndef?__KERNEL__
????????#define?__KERNEL__
#endif
#ifndef?MODULE
????????#define?MODULE
#endif
#include?<linux/init.h>
#include?<linux/module.h>
#include?<linux/kernel.h>
static?int?hello_init(void)
{
????????printk(KERN_ALERT?"Hello,?The?fucking?crazy?world\n");
????????return?0;
}
static?void?hello_exit(void)
{
????????printk(KERN_ALERT?"Bye,?The?fucking?crazy?world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("albcamus?<albcamus@163.com>");[/code:1:fbc83fc10a]
2.6內(nèi)核的kbuild子系統(tǒng)跟2.4相比有本質(zhì)的改變。我們下面嘗試兩種方式編譯這個程序:
1,?你可以在本目錄下這樣寫一個Makefile
[code:1:fbc83fc10a]obj-m?:=?hell.o
clean:
????????rm?-rf?*.o?.*.cmd?*.ko?*.mod.c?.tmp_versions[/code:1:fbc83fc10a]
然后用這樣的命令行編譯:
make?-C?/lib/modules/`uname?-r`/build?M=`pwd`?modules
這時ls一下,就能看到生成了很多文件,其中hello.ko就是我們需要的內(nèi)核模塊。
2,?專業(yè)點(diǎn)兒,Makefile這樣寫:
[code:1:fbc83fc10a]obj-m?:=?hello.o
KERNELBUILD?:=?/lib/modules/`uname?-r`/build
default:
????????make?-C?$(KERNELBUILD)?M=$(shell?pwd)?modules
clean:
????????rm?-rf?*.o?.*.cmd?*.ko?*.mod.c?.tmp_versions[/code:1:fbc83fc10a]
然后只要make一下就可以了。
插入模塊用insmod命令:
insmod?./hello.ko
這時候大家可能會問:為什么我的屏幕上沒有見到輸出?這個是console的日志記錄級別和你printk消息時指定的級別(本例中指定為KERN_ALERT,為次高,僅次于KERN_EMERG)決定的。無論如何,你可以tail?或者cat看看系統(tǒng)日志的最后幾行,系統(tǒng)日志一般為/var/log/messages,或者直接用dmesg命令,肯定能看到輸出了。
二,頭文件問題。
C程序員都知道,要使用某個外部的函數(shù),應(yīng)當(dāng)#include某個頭文件,這個頭文件包含了那個函數(shù)的原型(prototype)。內(nèi)核的頭文件在include/下,其中include/asm是個符號鏈接,指向你所用內(nèi)核的具體的體系結(jié)構(gòu)目錄,比方說我的系統(tǒng)是i386的,那么include/asm就指向include/asm-i386?。
內(nèi)核編程中我們不能鏈接libc庫,不能使用libc庫中的函數(shù),所以很有些麻煩。一些重要的函數(shù),象strcpy/strcmp/snprintf等,kernel也為我們實(shí)現(xiàn)并導(dǎo)出(export)了,而我們需要#include相關(guān)的頭文件,在include/linux和include/asm中,你需要自己尋找你所要使用的函數(shù)在哪個頭文件中聲明,并將其#include進(jìn)來。
總結(jié)
以上是生活随笔為你收集整理的Linux内核模块编程入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10月黄山风景区穿什么衣服
- 下一篇: 求一个女孩简单好听的名字!