




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Linux內核模塊HelloWorld一、確定任務了解內核模塊的概念。掌握基本的驅動程序設計。二、 學習內容 1、 內核模塊概述Linux內核是整體式結構,各個子系統聯系緊密,作為一個大程序在內核空間運行。太多的設備驅動程序和內核功能集成在內核中,內核過于龐大。如何解決?Linux內核引入內核模塊制。通過動態加載內核模塊,使得在運行過程中擴展內核的功能。不需要的時候。卸載該內核模塊。什么是內核模塊?內核模塊式一種沒有經過鏈接,不能獨立運行的目標文件,是在內核空間中運行的程序。經過鏈接裝載到內核里面成為內核的一部分,可以訪問內核的公用符號(函數和變量)內核模塊可以讓操作系統內核在需要是載入和執行
2、,在不需要時由操作系統卸載。它們擴展了操作系統訥河的功能卻不需要重新啟動系統。如果內有內核模塊,我們不得不一次又一次重新編譯生成單內核操作系統的內核鏡像來加入新的功能。還意味著一個臃腫的內核。內核模塊是如何被調入內核工作的? 當操作系統內核需要的擴展功能不存在時,內核模塊管理守護進程 kmod 執行 modprobe 去加載內核模塊。modprobe 遍歷文件/lib/modules/version/modules.dep來判斷是否有其它內核模塊需要在該模塊加載前被加載。最后 modprobe 調用 insmod 先加載被依賴的模塊,然后加載該被內核要求的模塊。2、模塊機制的優缺點模塊機制的優
3、點:減小內核映像尺寸,增加系統靈活性;節省開發時間;修改內核,不必重新編譯整個內核。 模塊的目標代碼一旦被鏈入內核,作用和靜態鏈接的內核目標代碼完全等價。模塊機制的缺點:對系統性能有一定損失; 使用不當時會導致系統崩潰。3、內核模塊函數入口與出口函數:初始化函數 module_init(),在模塊加載到內核時被調用。module_init()要么向內核注冊 它可以處理的事物,要么用自己的代碼替代某個內核函數。卸載函數 module_exit()或者cleanup_module(),在內核模塊被卸載時被調用,干一些收尾清理的工作, 撤消任何初始化函數module_init()做的事,保證內核模塊
4、可以被安全的卸載。(注意:任一個內核模塊需要包含 linux/module.h)(1)printk( )函數:printk 函數在 Linux 內核中定義并且對模塊可用,為內核提供日志功能, 記錄內核信息或用來給出警告。與標準 C 庫函數 printf 的行為相似。每個 printk()聲明都會帶一個優先級。內核總共定義了八個優先級的宏, 在 linux/kernel.h 中定義。若你不指明優先級,DEFAULT_MESSAGE_LOGLEVEL 這個默認 優先級將被采用。信息添加到文件 /var/log/messages,可直接查看,或者用命令 dmesg 查看。在 Xwindows 下的終
5、端 insmod 一個模塊,日志信息只會記錄在日志文件中,而不在終端打印。(2)內核模塊編譯順利編譯并且加載第一個“hello world”模塊有時就會比較困難。強烈建議使用標準內核源代碼包,編譯新內核并用新內核啟動系統。Linux 的發行版本經常給內核打一些非標準的補丁,這種情況會導致一些問題的發生。保 證 系 統 具 備 正 確 的 編 譯 器 、 模 塊 工 具 、 以 及 其 他 必 要 工 具 。 內 核 目 錄Documentation/Changes 列出了需要的工具版本。用錯誤的工具版本建立一個內核(包括模塊),可能導致一些奇怪復雜的問題。內核模塊編譯:為 2.6 版本內核構造
6、模塊,首先需要有配置并構建好的 2.6 內核源代碼樹。而且最好運行和模塊對應的內核。 2.6內核的模塊要和內核源代碼樹中的目標文件連接。2.6 內核的構建系統 kbuild,使得內核源碼外的內核模塊編譯跟內核編譯統一起來,無須手動給定這些參數。Hello-1.c 的 Makefile 文件:obj-m += hello-1.o表明有一個模塊要從目標文件 hello-1.o 建立,kbuild 從該目標文件建立內核模塊hello-1.ko。執行以下命令編譯模塊:make -C /usr/src/linux-uname -r M=$PWD modules改變目錄到用 -C 選項提供的內核源碼目錄,
7、在那里找到內核的頂層 makefile。M= 選 項使 makefile 在試圖建立模塊目標前, 回到模塊源碼目錄。2.6 內核引入新的內核模塊命名規范:內核模塊使用.ko 的文件后綴(代替 以往的.o 后綴),從而內核模塊區別于普通的目標文件。多個文件構成的內核模塊:*Makefile 會幫我們完成編譯和連接的工作。例如 內核模塊分兩個文件 start.c stop.c,則 ;Makefile 這樣寫:obj-m += startstop.ostartstop-objs := start.o stop.o跟單個文件模塊的編譯方式一樣,內核編譯系統會將所有的目標文件連接為一個文件。 內核模塊和
8、用戶程序的比較內核模塊是如何開始和結束的:*用戶程序通常從函數 main()開始,執行一系列的指令并且 當指令執行完成后結束程 序。從頭到尾執行任務。*內核模塊從函數 module_init() 指定的函數調用開始。這就是內核模 塊的入口函數。初始化函數的任務注冊自己,為以后內核調用模塊函數做準備。*模塊的退出函數則在模塊別卸載之前調用,撤銷“初始化函數”注冊的擴展功能。 *模塊可調用的函數*應用程序可以調用它沒有定義的函數(函數庫中的函數)。因為在連接階段與合適的函 數庫連接,解決外部引用。*內核模塊是連接到內核, 它能夠調用的函數和變量是內核公開的函數和變量,沒有庫來連接。可以在內核模塊中
9、使用的函數只能來自內核本身。(3)管理內核模塊的命令lsmod 列出已經掛載的內核模塊*lsmod 是列出目前系統中已加載的模塊的名稱及大小等*效果跟通過 less /proc/modules 查看模塊一樣。*modinfo 查看模塊信息* modinfo 可以查看模塊的信息,通過查看模塊信息來判定這個模塊的用途。* modinfo 模塊名 管理內核模塊的命令*modprobe 掛載新模塊以及新模塊相依賴的模塊*modprobe 模塊名,在掛載該內核模塊的同時,這個模塊所依賴的模塊也被同時掛載。*modprobe 還有其他用法,具體用法查看man modprobe 。例如:modprobe -
10、l 是列出內核中所有的模 塊,包括已掛載和未掛載的,讀取的模塊列表就位于 /lib/modules/uname -r 目錄中。*rmmod 移除已掛載模塊*用法:rmmod 模塊名(不帶后綴)*等同于:modprobe -r 模塊名*insmod 掛載模塊*insmod 需要給出模塊所在目錄的絕對路徑,以及要帶有模塊文件名后綴(.o 或.ko)*insmod *.ko*功能上沒有 modprobe 強。 *depmod 創建模塊依賴關系的列表*目前的的 Linux 發行版所用的內核是 2.6x 版本,是自動解決依賴關系。*depmod -a 為所有列在/etc/modprobe.conf 或/
11、etc/modules.conf 中的所有模塊創建依賴 關系,并且寫入到 modules.dep 文件*depmod e 列出已掛載但不可用的模塊。(4)注意事項*使用 insmod ./hello-1.ko 命令加載該模塊。*/proc/modules 記錄被加載的內核模塊。*使用命令 rmmod hello-1 卸載模塊*改變 module_init()返回值非零,重新編譯再加載,觀察結果發生了什么變化?*非 0 返回值表示初始化內核模塊失敗,模塊不能加載。*從內核 Linux 2.4 之后,可以為模塊的“初始化”和“卸載”函數起任意的名字。不再必須 使用 init_module()和 c
12、leanup_module()的名字。*通過宏 module_init()和 module_exit()實現。這些宏在 linux/init.h 中定義。module_init(hello_2_init); module_exit(hello_2_exit);*函數必須在宏的使用前定義,否則編譯會報錯。(5)關于 init 和exit 宏*如果該模塊被編譯進內核,而不是動態加載,則宏 init 的使用會在初始化完成后丟 棄該函數并收回所占內存。*如果該模塊被編譯進內核,宏 exit 將忽略“清理收尾”的函數。*這些宏在頭文件 linux/init.h 定義,用來釋放內核占用的內存。例如啟動時看
13、到的信息“Freeingunusedkernelmemory:236kfreed”,正是內核釋放這些函數所占用空間時的打印信息。三、代碼設計 一、 編寫源程序代碼#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>static int _init hello_init(void) printk("module initn"); printk("Hello worldn"); return 0;static void _exit
14、 hello_exit(void) printk("module exitn");module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("GPL");二、 編寫makefile文件ifneq ($(KERNELRELEASE),) obj-m :=hello.oelsemodule-objs :=hello.oKERNELDIR ?= /home/gec/linux_kernel#若僅編譯宿主機的驅動模塊則將KERNELDIR 替換成以下語句#KERNELDIR ?=/lib/modules/$(shell uname r)/build/PWD := $(shell pwd)modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesendifclean: $(RM) *.ko *.mod.c *.mod.o *.o *.order *.symvers *.cmd四、編譯代碼和運行在Ubuntu下建立目錄/home/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年江西省商品供銷合同模板
- 2025汽車租賃合同書樣本 汽車租賃合同撰寫范本
- 2025年合同之合同變更管理專員條款
- 2025年北京市租房合同范文
- 2025北京吉安斯科貿中心與北京市大發畜產公司土地轉讓合同
- 《財務分析框架》課件
- 基因疾病早期發現策略方案
- 2025新集小學門衛用工勞動合同
- 《效率提升成本分析》課件
- 2025合同要求本工程項目主要材料試驗、測量、質檢儀器設備清單
- 監理實施細則模板(信息化、軟件工程)
- 精神疾病治療新靶點-深度研究
- 教學課件-統計學(第三版)袁衛
- 醫院保安員培訓
- 教學設計-3.5函數的最值及其應用
- CNAS-CL01:2018 檢測和校準實驗室能力認可準則
- 血透室敘事護理
- 2024-2025學年湖南省邵陽市新邵縣第二中學高二上學期期中考試英語試卷
- 學習通《形勢與政策》2025春章節測試答案
- 2025年中共涼山州委辦公室面向全州考調所屬事業單位工作人員高頻重點模擬試卷提升(共500題附帶答案詳解)
- 夏季貨車行車安全教育
評論
0/150
提交評論