今年打算好好學學Linux下內核的開發,不過萬事開頭難,第一步當然是學著編譯內核,試驗了好多次都是失敗告終,昨天終於第一次在虛擬機上升級內核成功,今天就先來試著寫個hello world的程序,和編寫Linux下的應用程序差別還是很大的。
#include<linux/module.h>
#include<linux/init.h>
int __init hello_init (void)
{
printk("HelloWorld\n");
return 0;
}
void __exit hello_exit(void)
{
printk("GoodBye\n");
}
MODULE_AUTHOR("wanghaifeng <[email protected]>");
MODULE_DESCRIPTION("hello");
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);這是很簡單的一個的內核模塊代碼,沒有main函數,編譯的方式不能用gcc的常規方式。模塊調用module_init()和module_exit()將該模塊注冊到內核。每個模塊都有初始化函數和退出函數。下面需要對這個內核模塊進行編譯,新建一個Makefile文件。文件的內容如下
obj-m :=hello.o下面就可以進行編譯了,編譯的環境是RedHat5.3,內核版本是2.6.18-53.el5,使用下面的命令進行編譯:
# make -C /usr/src/kernels/2.6.18-53.el5-i686/ modules M=$PWD
make: Entering directory `/usr/src/kernels/2.6.18-53.el5-i686'
Building modules, stage 2.
MODPOST
make: Leaving directory `/usr/src/kernels/2.6.18-53.el5-i686'
可以看到目錄裡多了幾個文件,編譯成功,hello.ko就是生成的內核模塊。
# ls
hello.c hello.ko hello.mod.c hello.mod.o hello.o Makefile Module.symvers
使用insmod,lsmod,rmmod可以裝載,查看,卸載內核模塊,printk輸出的信息將會打印到日志裡面/var/log/messages
# insmod hello.ko //插入模塊,會調用hello_init()
# lsmod | grep -e hello -e Module //查看模塊
Module Size Used by
hello 5632 0
# rmmod hello //刪除模塊,會調用hello_exit()
# tail -f /var/log/messages //可以查看日志信息