欢迎来到天天文库
浏览记录
ID:37857102
大小:117.66 KB
页数:7页
时间:2019-06-01
《380-Linux Kernel 学习心得(二) Hello World》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、LinuxKernel學習心得(二):HelloWorld林致宇最簡單的HelloWorld模組學習LinuxModule跟學習其它程式語言一樣,,,,從HelloWorld開始我們的第一個程式,下面是最簡單的LinuxModule(檔名為hello.c):1#include23intinit_module(void)4{5printk(KERN_ALERT"HelloWorld");6return0;7}89voidcleanup_module(void)10{11printk(KERN_ALERT"GoodbyeWorld
2、");12}Module會有兩個主要的函數,init_module與cleanup_module。init_module通常是用來跟Kernel註冊一些東西或者是將一個Kernel函數改成自己寫的程式碼,它主要是告訴Kernel,我這個Module提供了什麼功能,當Kernel需要這些功能時會呼叫我所提供的功能,當init_module執行完畢時,這個Module就不會再做任何事直到Kernel需要這個Module所提供的功能。cleanup_module則是復原init_module所做的一切事情,讓這個Module可以安全地被卸載。在第5及第11行我們看
3、到printk這個函數,在Module裡我們無法使用標準C函式庫(libc),我們只能夠使用Kernel提供的函數,Kernel所提供的函數可以從/proc/kallsyms這個檔案中查詢到。Printk函數提供了Kernel的記錄(Log)機制,我們也可以用它來顯示一些訊息,訊息有數種等級,可於Kernel原始檔根目錄(我的是/usr/src/linux-source-2.6.32)下的include/linux/kernel.h查看有哪些等級,程式裡用了KERN_ALERT。接下來我們就要編譯這個Module了,我們需要寫一個Makefile,Makefil
4、e的寫法需要參考下面兩個檔案(Kernel原始檔根目錄下):Documentation/kbuild/modules.txtDocumentation/kbuild/makefiles.txt下面是一個簡單的Makefile範例:1obj-m+=hello.o23all:4make-C/lib/modules/$(shelluname-r)/buildM=$(PWD)5clean:6make-C/lib/modules/$(shelluname-r)/buildM=$(PWD)clean在makefiles.txt裡有說明,第1行的obj-m代表我們要將he
5、llo.o編譯成一個可載入的Module,若要編譯成Kernel內建的Module,則使用obj-y。第4行與第6行的寫法則是參考modules.txt中『Buildingexternalmodules』說明。寫好Makefile後,我們就可以執行make以便進行編譯的動作。編譯成功後,可以於放Module程式的目錄下看到hello.ko這個檔案,從Kernel2.6之後,KernelModule會以副檔名.ko的型式存在,接著執行insmod與rmmod就可以載入和卸載該Module:insmodhello.ko(一定要加副檔名)rmmodhello(不需要加
6、上副檔名)module_init()與與與module_exit()在Linux2.4之後,我們可以自行命名Module的初始及結束的函數名稱,只要利用module_init與module_exit這兩個巨集就可以了,下面是一個範例(注意第14~15行的地方),程式不難理解,就不再贅述。1#include23inthello2_init(void)4{5printk(KERN_ALERT"HelloWorld");6return0;7}89voidhello2_exit(void)10{11printk(KERN_ALERT"
7、GoodbyeWorld");12}1314module_init(hello2_init);15module_exit(hello2_exit);模組模組文件模組文件我們可以利用MODULE_LICENSE,MODULE_AUTHOR,MODULE_DESCRIPTION等巨集設定設定一個MODULE的相關資訊,下面是一個範例(17~19行):1#include23inthello3_init(void)4{5printk(KERN_ALERT"HelloWorld");6return0;7}89voidhello3_e
8、xit(void)10{
此文档下载收益归作者所有