380-Linux Kernel 学习心得(二) Hello World

380-Linux Kernel 学习心得(二) Hello World

ID:37857102

大小:117.66 KB

页数:7页

时间:2019-06-01

380-Linux Kernel 学习心得(二) Hello World_第1页
380-Linux Kernel 学习心得(二) Hello World_第2页
380-Linux Kernel 学习心得(二) Hello World_第3页
380-Linux Kernel 学习心得(二) Hello World_第4页
380-Linux Kernel 学习心得(二) Hello World_第5页
资源描述:

《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{

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。