初識Linux核心-DIY核心模組

dalerkd發表於2016-09-20

本節用到的命令

命令 用途
lsmod 列出核心中當前被載入的模組
ls list按指定需求列出檔案列表
ll “ls -a -l” 的別名
cat 內建閱讀器,像notepad
modinfo 獲取核心Module資訊
readelf 一款工具用來展示elf檔案內部的資訊

分層

核心狀態
核心空間裡的部件
裝置驅動程式

Linux中Moudle特指可載入核心模組
LKM

DIY一個劉姥姥程式帶領我們進入核心大門

//main.c

    /*定義了核心模組編寫最基本巨集和結構體,位於linux-[version]/include/linux/module.h*/
    #include <linux/module.h>
    //__init GCC工具鏈,初始化
    static int __init llaolao_init(void)
    {
        int n = 0x1937;
        printk(KERN_INFO "Hi,I am llaolao at address 0x%p stack 0x%p.\n",
        llaolao_init,&n);

        return 0;   
    }

static void __exit llaolao_exit(void)
{
    printk("Exiting from 0x%p.....Bye,CSDN Friends\n",llaolao_exit);

}
//回撥函式,被動呼叫
module_init(llaolao_init);
module_exit(llaolao_exit);

MODULE_AUTHOR("YY");
MODULE_DESCRIPTIONJ("LKM example - llaolao");
MODULE_LICENSE("GPL");/*非許可協議,不能呼叫其他模組程式碼,不能呼叫很多核心函式,強行call會失敗*/

談Moudle.h

Moudle.h很早的時候就存在了。
第一代作者是:Richard Hendersion

第二代作者是:Rusty Russell
由於前代linux暴露出來的缺陷XXX,開始重寫。netfilter/iptables主要貢獻者。

此外module.h還包含一個重要結構:

特殊符號

該結構是核心模組的“戶籍檔案”
頗為龐大的結構體
以連結串列形式相互關聯,模組列表
只是LKM,不包括核心本身

Linux命令:
lsmod
列出當前載入的module.
module數量和系統複雜度,架構複雜度,以及硬體數量密切相關。

<linux/init.h>
#define module_init(......)......
#define module_exit(......)......

上面兩個巨集在實際程式碼中利用了attribute機制取到函式地址.

連結

Makefile檔案相當於執行


    $ make -C /lib/modules/x.y.z/build SUBDIRS=<> modules

ll和ls的區別
ll可以列出檢視”.”開頭的隱藏檔案或資料夾
x.ko檔案:可載入的LKM檔案
x.o檔案:編譯.c產生的object檔案
x.mod.c GCC工具鏈根據module.h中所定義巨集內的編譯指令動態生成。
載入模組時用以校驗依賴的核心函式,
__moduversions section。
對被呼叫函式進行CRC檢查來倡導原始碼開源,如果不是在本版本的Linux編譯的很可能拒絕。檢查程式碼在:kernel/module.c check_version(……)

檢視.ko

    $ modinfo *.ko

ELF是Linux基礎格式,.ko其實是ELF格式的檔案,具體格式請參照《Executable and Linking Format (ELF) Specification 1.2》

    $readelf - h llaolao.ko

下表來自《Executable and Linking Format (ELF)》Optional部分與我經歷實際情況不符,需要深究!

連結後 記憶體中
ELF Header ELF Header
Program Header Table(Optional) Program Header Table
Section 0 Setion 0
Section 1 Section 1
Section … Section …
Section X Section X
Section Header Table Section Header Table (Optional)

核心態與使用者態

天行健,君子自強不息
地勢坤,君子厚德載物

分層

……
NTOSKRNL.EXE
HAL.DLL
Hardware

學習筆記整理自張銀奎先生的講座“Linux核心開發與除錯”。
2016年9月20日

相關文章