linux核心模組筆記,linux核心模組
主題:1. 嵌入式基礎知識2. linux核心介紹3. 核心的編譯和安裝(x86)4. 第一個模組5. 模組的相關工具6. 模組的符號匯出7. 模組的參數作業:1.看linux/module.h。以後每天看課程中接觸到的標頭檔 這個檔案所在的位置:/home/zshh/work/driver/kernel/linux-3.5/include/linux重點看module結構體(模組的計數就在module結構體中) 再module這個結構體中包含模組的狀態,模組的初始化話函數指標的定義, 還由exit函數指標的定義. 其中還包括對核心參數的操作,struct kernel_param *kp 這個結構體的定義如下: struct kernel_param{const char *name; const struct kernel parm_ops *ops; u16 perm; s16 level; union {void *arg; const struct kparam_string *str;const struct kparam_array * arr; }; }; const struct kernel parm_ops *ops; 這個函數包含了一些讀寫參數的相關操作. struct kernel_param_ops { int (*set)(const char* val, const struct kernel_param *kp) int (*set)(char *buffer, const struct kernel_param *kp) void(*free)(void * arg) }2.看__init宏#define __init _section(.init.text)#define __section(s) __attribute__((__section__(#S)))這個宏最紅替換出來就是 __attribute__((__section__(".init.text")代表他會被存放再.init.text. __init, __initdata等屬性標誌,是要把這種屬性的代碼放入目標檔案的.init.text節,資料放入.init.data節──這一過程是通過編譯核心時為相關目標平台提供了xxx.lds連結指令碼來指導ld完成的。//這個函數的執行分兩種情況如下:一:當編譯為模組的時候.使用insmod,或者是modprob插入模組到核心的時候,他會被執行.如果插入成功, __init屬性的函數就被執行;二:當代碼被編譯進入zImage中是,再核心引導時,執行 do_basic_setup()函數調用do_initcalls函數,.init節的所有函數都會被執行一遍. 在初始化完成後,用這些關鍵字標識的函數或資料所佔的記憶體會被釋放掉。三:所有的__init函數在initcall.init都有一個指標指向它. 3.看linux/list.h 4.實驗模組參數的bool型,測試可否使用0/1,y/n等;如果模組的參數為數組,則需要使用module_param_array宏來聲明自己寫個例子,測試該宏的使用1. 嵌入式基礎知識=======================嵌入式行業的當前發展情況,嵌入式系統構成等2.linux核心的說明=======================kernel目錄下有兩個核心,一個是從www.kernel.org下載的標準核心,一個是由google修改、三星移植的核心;解壓縮核心後說明一下目錄結構,並介紹核心的核心功能3.核心的編譯安裝(x86)=======================(1)核心的配置$>make menuconfig通過圖形介面(依賴於ncurses庫),決定編譯的核心都包含哪些部分。最終的配置結果,儲存在.config檔案中決定代碼是否編譯,如果編譯,是編譯到zImage中,還是編譯為.ko模組(2)核心的編譯$>make編譯產生zImage核心和.ko模組(3)核心模組的安裝$>make modules_install將產生的.ko安裝到磁碟上的特定位置(就是拷貝)一般是/lib/modules/xxx/目錄(xxx為編譯的核心的版本)(4)核心的安裝$>make install將產生的zImage安裝到/boot目錄下(zImage在x86上稱為bzImage,位於arch/x86/boot/目錄下)接下來可以重新啟動系統,看看新編譯的核心能否使用(要看運氣)4.第一個模組=========================參考x86-drv/01mod/目錄下的mod_test01.c和Makefile認真瞭解這兩個檔案中每部分的作用5. 模組的相關工具(5個)=========================(1)模組的手工載入$>insmod mod_test01.ko會調用模組的入口函數,如果是printk的資訊,用$>dmesg查看(2)模組的手工卸載$>rmmod mod_test01(3)顯示模組資訊$>modinfo xxx.ko(4)列出核心中已經載入的模組$>lsmod(5)自動載入模組模組的自動載入工具。該工具可以自動將模組所依賴的模組也一起載入。modprobe只能載入/lib/modules/xxx下的模組。$>modprobe xxx//載入$>modprobe -r xxx //卸載tip:$>dmesg顯示printk的資訊$>dmesg -c清除printk的緩衝區6.模組的符號匯出==========================為了避免命名空間汙染,核心規定,.ko模組中的所有符號預設都為局部。必須通過EXPORT_SYMBOL宏匯出後,才具有全域屬性;EXPORT_SYMBOL宏可用於全域函數和全域變數;寫01mod/mod_test02.c和mod_test03.c產生模組mod_test02.ko和mod_test03.ko可以用insmod/rmmod或modprobe測試$>make install //執行Makefile中的目標install$>modprobe mod_test03會把依賴的mod_test02也載入$>modprobe -r mod_test03用-r可以卸載模組7.模組的參數=========================用module_param宏來聲明模組參數參考01mod/mod_test04.c模組參數對應的檔案是/sys/module/mod_test03/parameters/name和valuemodule_param宏的第3個參數,就用來確定這兩個檔案的permission