自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在Ubuntu下如何編譯第一個(gè)內(nèi)核模塊?

運(yùn)維 系統(tǒng)運(yùn)維
內(nèi)核模塊是Linux內(nèi)核向外部提供的一個(gè)插口,其全稱為動(dòng)態(tài)可加載內(nèi)核模塊(LoadableKernelModule,LKM),我們簡(jiǎn)稱為模塊。本文介紹了在Ubuntu系統(tǒng)下編譯的第一個(gè)內(nèi)核模塊的方法。

Ubuntu系統(tǒng)屬于linux系統(tǒng),本文介紹了在Ubuntu下編譯的***個(gè)內(nèi)核模塊的方法,具體內(nèi)容如下所述。

內(nèi)核模塊是Linux內(nèi)核向外部提供的一個(gè)插口,其全稱為動(dòng)態(tài)可加載內(nèi)核模塊(LoadableKernelModule,LKM),我們簡(jiǎn)稱為模塊。Linux內(nèi)核之所以提供模塊機(jī)制,是因?yàn)樗旧硎且粋€(gè)單內(nèi)核(monolithickernel)。單內(nèi)核的***優(yōu)點(diǎn)是效率高,因?yàn)樗械膬?nèi)容都集成在一起,但其缺點(diǎn)是可擴(kuò)展性和可維護(hù)性相對(duì)較差,模塊機(jī)制就是為了彌補(bǔ)這一缺陷。

一、什么是模塊

模塊是具有獨(dú)立功能的程序,它可以被單獨(dú)編譯,但不能獨(dú)立運(yùn)行。它在運(yùn)行時(shí)被鏈接到內(nèi)核作為內(nèi)核的一部分在內(nèi)核空間運(yùn)行,這與運(yùn)行在用戶空間的進(jìn)程是不同的。模塊通常由一組函數(shù)和數(shù)據(jù)結(jié)構(gòu)組成,用來實(shí)現(xiàn)一種文件系統(tǒng)、一個(gè)驅(qū)動(dòng)程序或其他內(nèi)核上層的功能。

應(yīng)用程序與內(nèi)核模塊的比較

為了加深對(duì)內(nèi)核模塊的了解,表一給出應(yīng)用程序與內(nèi)核模塊程序的比較。

表一應(yīng)用程序與內(nèi)核模塊程序的比較

在Ubuntu下如何編譯***個(gè)內(nèi)核模塊?

從表一我們可以看出,內(nèi)核模塊程序不能調(diào)用libc庫(kù)中的函數(shù),它運(yùn)行在內(nèi)核空間,且只有超級(jí)用戶可以對(duì)其運(yùn)行。另外,模塊程序必須通過module_init()和module-exit()函數(shù)來告訴內(nèi)核“我來了”和“我走了”。

二、編寫一個(gè)簡(jiǎn)單的模塊

模塊和內(nèi)核都在內(nèi)核空間運(yùn)行,模塊編程在一定意義上說就是內(nèi)核編程。因?yàn)閮?nèi)核版本的每次變化,其中的某些函數(shù)名也會(huì)相應(yīng)地發(fā)生變化,因此模塊編程與內(nèi)核版本密切相關(guān)。以下例子針對(duì)Ubuntu9.10內(nèi)核2.6.31-14-generic

1.程序舉例

 

  1. #include  
  2.  
  3. #include  
  4.  
  5. #include  
  6.  
  7. MODULE_LICENSE("GPL");  
  8.  
  9. staticint__initlkp_init(void)  
  10.  
  11. {  
  12.  
  13. printk(KERN_ALERT"HelloWorld!\n");  
  14.  
  15. return0;  
  16.  
  17. }  
  18.  
  19. staticvoid__exitlkp_cleanup(void)  
  20.  
  21. {  
  22.  
  23. printk(KERN_ALERT"ByeWorld!\n");  
  24.  
  25. }  
  26.  
  27. module_init(lkp_init);  
  28.  
  29. module_exit(lkp_cleanup);  
  30.  
  31. MODULE_AUTHOR("heyutao");  
  32.  
  33. MODULE_DESCRIPTION("hello"); 

 

說明

所有模塊都要使用頭文件module.h,此文件必須包含進(jìn)來。

頭文件kernel.h包含了常用的內(nèi)核函數(shù)。

頭文件init.h包含了宏_init和_exit,它們?cè)试S釋放內(nèi)核占用的內(nèi)存。

lkp_init是模塊的初始化函數(shù),它必需包含諸如要編譯的代碼、初始化數(shù)據(jù)結(jié)構(gòu)等內(nèi)容。

使用了printk()函數(shù),該函數(shù)是由內(nèi)核定義的,功能與C庫(kù)中的printf()類似,它把要打印的信息輸出到終端或系統(tǒng)日志。

lkp_cleanup是模塊的退出和清理函數(shù)。此處可以做所有終止該驅(qū)動(dòng)程序時(shí)相關(guān)的清理工作。

module_init()和cleanup_exit()是模塊編程中最基本也是必須的兩個(gè)函數(shù)。

module_init()是驅(qū)動(dòng)程序初始化的入口點(diǎn)。而cleanup_exit()注銷由模塊提供的所有功能。

2編寫Makefile文件,與hello.c放在同一個(gè)目錄里

 

  1. obj-m:=hello.oKERNELBUILD:=/lib/modules/$(shelluname-r)/builddefault:make-C$(KERNELBUILD)M=$(shellpwd)modulesclean:rm-rf*.o*.ko*.mod.c.*.cmd*.markers*.order*.symvers.tmp_versions 

 

(注意makefile里面要求的tab)

KERNELBUILD:=/lib/modules/$(shelluname-r)/build是編譯內(nèi)核模塊需要的Makefile的路徑,Ubuntu下是

/lib/modules/2.6.31-14-generic/build

make-C$(KERNELBUILD)M=$(shellpwd)modules編譯內(nèi)核模塊。-C將工作目錄轉(zhuǎn)到KERNELBUILD,調(diào)用該目錄下的Makefile,并向這個(gè)Makefile傳遞參數(shù)M的值是$(shellpwd)modules。

3.編譯模塊

#sudomake(調(diào)用***個(gè)命令default)

這時(shí),在hello.c所在文件夾就會(huì)有hello.ko,這個(gè)就是我們需要的內(nèi)核模塊啦

#sudomakeclean

清理編譯垃圾,hello.ko也會(huì)清理掉。

4.插入模塊,讓其工作。注意必須是root權(quán)限

#sudoinsmod./hello.ko我們用dmesg就可以看到產(chǎn)生的內(nèi)核信息啦,Helloworld!

如果沒有輸出"hellofromhelloworld",因?yàn)槿绻阍谧址K端而不是終端模擬器下運(yùn)行的話,就會(huì)輸出,因?yàn)樵诮K端模擬器下時(shí)會(huì)把內(nèi)核消息輸出到日志文件/var/log/kern.log中。

#sudormmod./hello再用dmesg可以看到Byeworld!

在Ubuntu下如何編譯***個(gè)內(nèi)核模塊?

modutils是管理內(nèi)核模塊的一個(gè)軟件包??梢栽谌魏潍@得內(nèi)核源代碼的地方獲取Modutils(modutils-x.y.z.tar.gz)源代碼,然后選擇***級(jí)別的patch.x.y.z等于或小于當(dāng)前的內(nèi)核版本,安裝后在/sbin目錄下就會(huì)有insomod、rmmod、ksyms、lsmod、modprobe等實(shí)用程序。當(dāng)然,通常我們?cè)诩虞dLinux內(nèi)核時(shí),modutils已經(jīng)被載入。1.Insmod命令調(diào)用insmod程序把需要插入的模塊以目標(biāo)代碼的形式插入到內(nèi)核中。在插入的時(shí)候,insmod自動(dòng)調(diào)用init_module()函數(shù)運(yùn)行。注意,只有超級(jí)用戶才能使用這個(gè)命令,其命令格式為:#insmod[path]modulename.ko2.rmmod命令調(diào)用rmmod程序?qū)⒁呀?jīng)插入內(nèi)核的模塊從內(nèi)核中移出,rmmod會(huì)自動(dòng)運(yùn)行cleanup_module()函數(shù),其命令格式為:#rmmod[path]modulename.ko3.lsmod命令調(diào)用lsmod程序?qū)@示當(dāng)前系統(tǒng)中正在使用的模塊信息。實(shí)際上這個(gè)程序的功能就是讀取/proc文件系統(tǒng)中的文件/proc/modules中的信息,其命令格式為:#lsmod4.ksyms命令

ksyms這個(gè)程序用來顯示內(nèi)核符號(hào)和模塊符號(hào)表的信息。與lsmod相似,它的功能是讀取/proc文件系統(tǒng)中的另一個(gè)文件/proc/kallsyms。

這就是在2.6.xx下一個(gè)最簡(jiǎn)單的模塊編寫過程。

總結(jié):

希望本文介紹的在Ubuntu下編譯的***個(gè)內(nèi)核模塊的方法能夠?qū)ψx者有所幫助,更多有關(guān)linux系統(tǒng)的知識(shí)還有待于讀者去探索和學(xué)習(xí)。

【編輯推薦】

  1. Ubuntu10.04下如何移植QtE?
  2. 如何在Ubuntu下訪問局域網(wǎng)服務(wù)器?
  3. 如何在Ubuntu下安裝媒體中心XBMC?
  4. Ubuntu10.10下MySQL5.1如何進(jìn)行集群配置?
  5. UbuntuLinux下USB轉(zhuǎn)串口的應(yīng)用及minicom的設(shè)置方法
責(zé)任編輯:韓亞珊 來源: 雨木林風(fēng)
相關(guān)推薦

2014-07-24 14:35:26

Linux內(nèi)核模塊

2010-04-12 11:19:47

編譯內(nèi)核模塊

2021-07-06 14:36:05

RustLinux內(nèi)核模塊

2009-12-17 15:28:32

內(nèi)核模塊編譯

2023-05-08 08:05:42

內(nèi)核模塊Linux

2018-10-15 10:10:41

Linux內(nèi)核補(bǔ)丁

2018-06-19 09:07:57

Linux內(nèi)核模塊

2010-01-22 11:01:04

linux內(nèi)核模塊

2011-06-24 13:38:32

QT 編譯 安裝

2023-09-28 13:21:32

2019-07-08 20:00:35

Linux內(nèi)核模塊

2011-08-29 16:31:30

UbuntuAndroid

2010-07-30 14:50:38

Flex項(xiàng)目

2010-02-26 15:38:29

Linux內(nèi)核版本

2021-09-03 08:44:51

內(nèi)核模塊Linux社區(qū)

2011-07-06 18:31:21

Xcode 4 iPhone 模擬器

2021-12-30 11:26:31

語言編譯器腳本

2021-04-07 13:38:27

Django項(xiàng)目視圖

2023-09-21 22:43:17

Django框架

2011-03-03 21:04:08

bug程序員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)