Linux內核模塊講解_第1頁
Linux內核模塊講解_第2頁
Linux內核模塊講解_第3頁
Linux內核模塊講解_第4頁
Linux內核模塊講解_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

操作系統(tǒng)課程設計專題二:內核模塊主講:張志欽1AbstractLinux內核模塊12實驗要求內核模塊舉例321.Linux內核模塊3單體內核

VS

微內核(概念)單體內核(Microkernel)整個核心程序都是以核心空間(KernelSpace)的身份及監(jiān)管者模式(SupervisorMode)來運行;操作系統(tǒng)的代碼高度緊密,所有的模塊都在同一塊尋址空間內運行微內核(Microkernel)微內核本身只提供最基本的操作系統(tǒng)的功能,比如進程調度與消息傳遞等其他的功能由其獨立的模塊提供,每個獨立的功能模塊都可以是一個進程。當我們需要使用某個功能的時候,我們只需要在運行的操作系統(tǒng)里安裝這個模塊,并且運行對應服務,當這個功能不再需要的時候,我們可以停止這個服務,這樣這個功能模塊將不占據(jù)系統(tǒng)內存和處理器的資源,而不會破壞當前的系統(tǒng)正常運4效率問題驅動程序問題內核升級問題微內核設計方式帶來的優(yōu)勢模塊化的方式設計操作系統(tǒng),模塊的設計者只需要關注自己的功能模塊。操作系統(tǒng)的更新時,除了微內核本身,可以動態(tài)的更新其他的功能模塊在系統(tǒng)運行的時候,可以根據(jù)需要動態(tài)的使能/禁止對應的模塊,以釋放計算機的資源。單體內核

VS

微內核(優(yōu)缺點)5單體內核

VS

微內核(實例)單體內核傳統(tǒng)的UNIX大行其道的Linux商業(yè)化非常成功的Solaris微內核WindowsMacOSWindRiverVxWorksLinux系統(tǒng)如何解決單體內核的缺陷6Linux的內核模塊(概念)Linux內核引入內核模塊機制LKM--LoadableKernelModule通過動態(tài)加載內核模塊,使得在運行過程中擴展內核的功能不需要的時候,卸載該內核模塊7Linux的內核模塊(概念)內核模塊是一種沒有經(jīng)過鏈接,不能獨立運行的目標文件,是在內核空間中運行的程序。經(jīng)過鏈接裝載到內核里面成為內核的一部分,可以訪問內核的公用符號(函數(shù)和變量)。內核模塊可以讓操作系統(tǒng)內核在需要時載入和執(zhí)行,在不需要時由操作系統(tǒng)卸載。它們擴展了操作系統(tǒng)內核的功能卻不需要重新啟動系統(tǒng)。如果沒有內核模塊,我們不得不一次又一次重新編譯生成單內核操作系統(tǒng)的內核鏡像來加入新的功能。這還意味著一個臃腫的內核。8Linux的內核模塊(圖)9Linux的內核模塊(圖)1011Linux的內核模塊(優(yōu)缺點)模塊機制的優(yōu)點:減小內核映像尺寸,增加系統(tǒng)靈活性;節(jié)省開發(fā)時間;修改內核,不必重新編譯整個內核。模塊的目標代碼一旦被鏈入內核,作用和靜態(tài)鏈接的內核目標代碼完全等價。模塊機制的缺點:對系統(tǒng)性能有一定損失;使用不當時會導致系統(tǒng)崩潰;12Linux的內核模塊(相關命令)內核模塊的加載

#insmodmodule_name內核模塊的卸載當我們不需要內核模塊了,為了減少系統(tǒng)資源的開銷,需要卸載時使用命令#rmmodmodule_name或者#modprobe–rmodule_name查看系統(tǒng)已經(jīng)加載的模塊#lsmod查看系統(tǒng)已經(jīng)加載的模塊信息#modinfo132.內核模塊舉例14內核模塊實現(xiàn)的幾個步驟新建模塊目錄用編輯器(vi)編輯源文件用編輯器編輯Makefile編譯模塊15內核模塊源代碼

//hello.c

#include<linux/init.h>

//formodule_init()#include<linux/module.h>

//mustbeinclude#include<linux/kernel.h>

//forprintk()

staticint

hello_init(void){printk(“Helloworld\n”);return0;}staticvoid

hello_exit(void){printk(“Hellomoduleexit\n”);}module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE(“GPL”);MODULE_AUTHOR(“rapide”);

內核模塊說明說明:模塊入口函數(shù)為hello_init(),由module_init()宏指定,在模塊被加載的時候被調用向系統(tǒng)注冊入口函數(shù)的返回值為0表示成功,非0表示失敗模塊的退出函數(shù)為hello_exit(),由module_exit()宏指定,在模塊被卸載是被調用向系統(tǒng)注銷,主要來完成資源的清理工作,它被調用完畢后,就模塊就被內核清除了一個模塊最少需要有入口和退出函數(shù)16內核模塊說明說明:2.4內核后,引入識別代碼是否在GPL許可下發(fā)布的機制。在使用非公開的源代碼產品時會得到警告。通過宏MODULE_LICENSE(“GPL”),設置模塊遵守GPL證書,取消警告信息。宏MODULE_DESCRIPTION()用來描述模塊的用途。宏MODULE_AUTHOR()用來聲明模塊的作者。宏MODULE_SUPPORTED_DEVICE()聲明模塊支持的設備。這些宏都在頭文件linux/module.h定義。使用這些宏只是用來提供識別信息。17內核模塊說明printk()函數(shù)printk函數(shù)在Linux內核中定義并且對模塊可用,為內核提供日志功能,記錄內核信息或用來給出警告。與標準C庫函數(shù)printf的行為相似。每個printk()聲明都會帶一個優(yōu)先級。內核總共定義了八個優(yōu)先級的宏,在linux/kernel.h中定義。若你不指明優(yōu)先級,DEFAULT_MESSAGE_LOGLEVEL這個默認優(yōu)先級將被采用。信息添加到文件/var/log/messages,可直接查看,或者用命令dmesg查看。在X-windows下的終端insmod一個模塊,日志信息只會記錄在日志文件中,而不在終端打印。18內核模塊說明19寫內核程序需要注意:

內核模塊的makefileobj-m:=hello.oKERNELDIR:=/lib/modules/2.6.20/buildPWD:=$(shellpwd)

modules:

$(MAKE)-C$(KERNELDIR)M=$(PWD)modules

modules_install:

$(MAKE)-C$(KERNELDIR)M=$(PWD)modules_installclean:

rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versions20內核模塊的makefileMakefile說明:為2.6版本內核構造模塊首先需要有配置并構建好的2.6內核源代碼樹。而且最好運行和模塊對應的內核。2.6內核的模塊要和內核源代碼樹中的目標文件連接。2.6內核的構建系統(tǒng)Kbuild,使得內核源碼外的內核模塊編譯跟內核編譯統(tǒng)一起來,無須手動給定這些參數(shù)。改變目錄到用-C選項提供的內核源碼目錄,在那里找到內核的頂層makefile。M=選項使makefile在試圖建立模塊目標前,回到模塊源碼目錄。2122內核模塊的編譯在hello模塊源文件所在目錄上#make得到hello.ko就是產生的內核模塊23內核模塊的加載

#insmodhello.ko24內核模塊的卸載

#rmmodhello內核模塊安裝時如何傳遞參數(shù)2526內核模塊的參數(shù)內核允許對模塊指定參數(shù),這些參數(shù)可在裝載模塊時改變。在運行insmod或者modprobe命令時給出參數(shù)的值。

insmodhello.kohowmany=10whom="Mom"如何定義實現(xiàn)模塊參數(shù)呢?要傳遞參數(shù)給模塊,首先將獲取參數(shù)值的變量聲明為全局變量。然后使用宏moudle_param來聲明

intmyint=3;

module_param(myint,int,0);27內核模塊的參數(shù)module_param(name,type,perm); perm是一個權限值,控制誰可以存取模塊參數(shù)在sysfs中的表示。 perm被設為0,就根本沒有sysfs項這個宏定義應當放在任何函數(shù)之外,典型地是出現(xiàn)在源文件的前面。應該總是為變量賦初值。28內核模塊的參數(shù)宏MODULE_PARM_DESC()

用來注解該模塊可以接收的參數(shù)。該宏兩個參數(shù):變量名和一個對該變量的描述。模塊可以用這樣的命令行加載:

./insmodmymodule.komyvariable=229內核模塊的參數(shù)聲明一個數(shù)組參數(shù):

module_param_array(name,type,num,perm);name數(shù)組的名子(也是參數(shù)名)type數(shù)組元素的類型num是數(shù)組元素的個數(shù),模塊加載者拒絕比數(shù)組能放下的多的值。2.6.9傳遞數(shù)組個數(shù)變量名,2.6.11傳遞數(shù)組個數(shù)變量的地址。perm是通常的權限值.如果數(shù)組參數(shù)在加載時設置。30內核模塊的參數(shù)聲明一個數(shù)組參數(shù):

module_param_array(name,type,num,perm);name數(shù)組的名子(也是參數(shù)名)type數(shù)組元素的類型num是數(shù)組元素的個數(shù),模塊加載者拒絕比數(shù)組能放下的多的值。2.6.9傳遞數(shù)組個數(shù)變量名,2.6.11傳遞數(shù)組個數(shù)變量的地址。perm是通常的權限值.如果數(shù)組參數(shù)在加載時設置。31內核模塊的參數(shù)參數(shù)數(shù)組的定義:staticinttest[5]={1,2,3,4,5};staticintnum=5;module_param(num,int,0);module_param_ar

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論