初識Linux核心-DIY核心模組
本節用到的命令
命令 | 用途 |
---|---|
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日
相關文章
- Linux核心模組Linux
- Linux核心模組編譯Linux編譯
- Linux核心模組學習Linux
- 高效學習Linux核心——核心模組編譯Linux編譯
- 深入學習 Linux 核心模組Linux
- 【linux】驅動-2-核心模組Linux
- 認識linux核心(linux核心的作用)Linux
- 初識Linux滲透:從列舉到核心利用Linux
- 核心補丁熱更新ceph核心模組
- 如何使用cgdb + qemu除錯linux核心模組除錯Linux
- node核心模組-vm
- toa 核心模組分析
- 驅動篇——核心空間與核心模組
- Linux核心net模組引入了Rust程式碼 - PhoronixLinuxRust
- 【核心模組】node.jsNode.js
- 核心模組建立檔案
- 【轉載】Linux核心除錯之使用模組引數Linux除錯
- Linux核心模組驅動載入與dmesg除錯Linux除錯
- 核心模組的載入流程
- webpack核心模組tapable用法解析Web
- Linux 核心101:cache組織策略Linux
- Nodejs核心模組之net和httpNodeJSHTTP
- node 核心模組學習之 Buffer
- 概述nodejs模組系統核心原理NodeJS
- webpack核心模組tapable原始碼解析Web原始碼
- DIY 實現 ThinkPHP 核心框架(五)ComposerPHP框架
- DIY 實現 ThinkPHP 核心框架 (一)MVCPHP框架MVC
- DIY 實現 ThinkPHP 核心框架 (三)路由PHP框架路由
- Linux核心之 核心同步Linux
- vite 虛擬模組初識Vite
- Linux核心筆記004 - 從記憶體管理開始,認識Linux核心Linux筆記記憶體
- Nginx 架構——【核心流程+模組介紹】Nginx架構
- 深入淺出 Node ( 四 ) HTTP核心模組HTTP
- Zepto核心模組之工具方法拾遺
- 刪除不必要的核心模組
- DIY 實現 ThinkPHP 核心框架 (十)App 類PHP框架APP
- DIY 實現 ThinkPHP 核心框架 (九)Container 類PHP框架AI
- DIY 實現 ThinkPHP 核心框架 (十二)Facade 類PHP框架
- Linux核心筆記003 - Linux核心程式碼裡面的C語言和組合語言Linux筆記C語言組合語言