模塊 /構建 /製造 /測試 / POC / Rehearsal / Notes / Precraper /許可 /書籍 /鏈接
Linux內核模塊(LKM)沙盒是一個不同模塊的集合,可以學習,發現和實驗Linux內核模塊的開發。該存儲庫的目的也是在Linux內核中實踐開發並研究其他概念,然後再向內核提交第一個補丁。
大多數模塊說明了一個概念,並顯示瞭如何使用內核API。一些模塊結合了一個以上的概念,以表明概念如何共同運作。例如,模塊LKM_DEVICE正在訪問字符設備並將其主要編號存儲在 /proc中。或模塊LKM_MEM也正在通過 /proc中的文件公開內存 /交換信息。
我希望它對於嘗試接近Linux內核的其他開發人員可能很有價值。
| 不。 | 模塊 | 來源 | 描述 |
|---|---|---|---|
| 1 | LKM Debugfs | lkm_debugfs.c | 模塊顯示如何使用調試文件系統debugfs |
| 2 | LKM設備 | lkm_device.c | 模塊顯示如何使用字符設備運行並在 /proc中存儲設備信息 |
| 3 | LKM設備編號 | lkm_device_numbers.c | 說明靜態和動態分配的設備編號 |
| 3 | LKM內存 | lkm_mem.c | 模塊將內存和交換信息揭示到 /PROC |
| 4 | LKM基於內存的設備 | lkm_mev.c | 基於內存的角色設備的驅動程序,在一定程度上,在書籍Linux設備驅動程序中開發的驅動程序,第3章 |
| 5 | LKM參數 | lkm_parameters.c | 用於傳遞參數從用戶到內核空間的模塊 |
| 6 | LKM漂亮的printk | lkm_pp.c | 用於測試Pretty-Printk集成的模塊 |
| 7 | LKM Proc | lkm_proc.c | 使用順序I /O訪問 /PROC文件系統的模塊 |
| 8 | LKM過程 | lkm_process.c | 訪問和打印當前過程信息 |
| 9 | LKM沙箱 | lkm_sandbox.c | 用於不同實驗的沙盒模塊 |
| 10 | LKM骨骼 | lkm_skeleton.c | 用於更快的新模塊腳手架的骨架模塊 |
第一次克隆時,請用--recurse-submodules的子模型克隆,以使其變得非常貼合。
git clone --recurse-submodules [email protected]:tpiekarski/lkm-sandbox.gitmake clean && make
要運行所有可用的測試,包括基本的加載/卸載和所有其他概念測試。
make test通過加載,卸載和輸出內核環緩衝區進行測試(Sudo將要求根本權限)。
make test-module name= < module-name >用於沙箱設備的其他測試,包括加載模塊,從 /PROC收集主要設備號,創建設備並比較最終消息,然後將MakeFile目標運行的make test-device運行或運行以下命令。
對於創建字符設備,需要主要數字,可以通過偏用文件 /proc /lkm_device_major來獲得。該主要數字也寫在內核環緩衝區。可以使用模塊參數param_major_num加載該模塊,並加載此模塊,例如sudo insmod lkm_device.ko param_major_num=241 (此刻此靜態分配似乎不可靠。有時會像以前的情況一樣,有時嘗試了sandbox設備的註冊。
sudo insmod lkm_device.ko
dmesg | grep " Registered sandbox device "
sudo mknod /dev/lkm_device c $( cat /proc/lkm_device_major ) 0
test -c /dev/lkm_device && cat /dev/lkm_device || echo " Device /dev/lkm_device " not found. "
sudo rmmod lkm_device沙箱訪問 /PROC的其他測試,包括加載模塊,測試是否存在 /PROC是否存在並輸出該文件。用make test-proc -proc運行MakeFile Target測試過程,或者以下幾個命令:
sudo insmod lkm_proc.ko
test -f /proc/lkm_proc && cat /proc/lkm_proc || echo " File /proc/lkm_proc not found. "
sudo rmmod lkm_proc有關將參數傳遞到模塊LKM_PARAMETER的其他測試,請使用make test-parameters 。這將加載/卸載模塊,並比較在/sys filesystem(/sys/module/lkm_parameters/parameters/*)中,將模塊加載時傳遞的參數編號和消息。或運行以下命令。
sudo insmod lkm_parameters.ko number=33 message= " Some message... "
cat /sys/module/lkm_parameters/parameters/number
cat /sys/module/lkm_parameters/parameters/message
sudo rmmod lkm_parameters在分盤,調試和處理錯誤和問題時,嘗試一些代碼並編寫POC來證明某些陳述或回答問題可能會派上用場。在以下內容中是這樣的POC集合,該集合跟進了我最近遇到的陳述,想法和問題。
| 文件 | 描述 | 動機 |
|---|---|---|
| 比較iopl-ioperm.c | 比較IOPL和IOPERM授予的I/O權限 | BUG 205317 -IOPL(2) - 特權級別設置為每個程序還是每條線程? |
| 權限 - 重新訴訟 | 使用克隆,叉,execve或pthread時,如何/o權限如何授予? | BUG 205317 -IOPL(2) - 特權級別設置為每個程序還是每條線程? |
為了更好地了解內核空間中的概念,有必要審查和排練C和標準庫的基本基礎。除了能夠提高理解之外,可以比較方法。這些基礎知識大多數都是低級的,從文件I/O開始,可以作為伴侶來源視為。排練事情永遠不會是不好的,但是有時候承認不得不排練這樣的事情有些尷尬:)
| 文件 | 概念 |
|---|---|
| 複製 | 用克隆()克隆過程 |
| execve.c | 用execve()執行另一個過程 |
| 叉 | 用fork()創建子過程 |
| io_ports.c | 低級端口映射I/O操作 |
| 讀 | 在香草C中讀取文件 |
| simple_circular_buffer.c | 簡單直接的圓形緩衝區 |
| write.c | 寫/附加到香草C中的文件 |
要構建這些文件,只需運行make clean && make in ./rehearsals/ ,所有可執行文件將放置在構建目錄中。
“ Linux內核模塊是一塊編譯的二進制代碼,該代碼直接插入Linux內核,在RING 0上運行,這是X86-64處理器中最低和最不受保護的執行環。”
“傳統的應用程序開發範例可以在很大程度上被丟棄。除了加載和卸載模塊之外,您還將編寫對系統事件響應的代碼,而不是按順序模式進行操作。”
“隨著內核的開發,您正在編寫API,而不是應用程序本身。”
該存儲庫會要求您徵求根許可,因為某些操作(例如加載/卸載模塊和Linux/GNU系統中的文件)取決於根特權。 Makefile將事先指出這些權限將使用的內容。
您可以通過搜索此存儲庫來查看所有這些操作,並確保不會以任何方式被濫用。我知道這可能是一個安全問題,但是我試圖使此過程盡可能透明。但是,還要意識到這些模塊就沒有任何保修。內核恐慌和數據丟失可能會發生,請最好將它們在虛擬機中使用。
在以下是一個表格的表格,所有位置都使用了sudo(除了readme.md除外)。
grep -n -r " sudo " *| 文件:行 | 使用sudo |
|---|---|
| Makefile:118 | |
| makefile:119 | $(eval number_file_content = sudo cat $(number_file) ) |
| makefile:122 | |
| Makefile:123 | |
| makefile:126 | @sudo rmmod $(module_filename) |
| makefile:140 | @sudo mknod $(device_filename)c cat $(proc_filename) 0 |
| makefile:143 | @sudo rm $(device_filename) |
| makefile:144 | @sudo rmmod $(module_filename) |
| makefile:162 | @sudo rmmod $(module_filename) |
| Makefile:175 | @sudo mknod |
| Makefile:176 | @echo“測試” | sudo tee $(device_file) |
| Makefile:178 | @sudo rm -fv $(device_file) |
| Makefile:179 | @sudo rmmod $(模塊) |
| Makefile:190 | @sudo insmod |
| Makefile:193 | @sudo rmmod $(模塊) |
| makefile:207 | @sudo rmmod $ {module} |
| Makefile:219 | @sudo insmod $(模塊).ko |
| makefile:222 | @sudo rmmod $(模塊) |
| tests.mk:31 | @lsmod | awk'{print $$ 1}'| grep -qe“^$(1)$$” &&(sudo rmmod |
| tests.mk:75 | @sudo dmesg-清晰 |
| tests.mk:78 | @sudo rmmod $(1) |
LKM Sandbox是免費軟件:您可以將其重新分配和/或根據自由軟件基金會發布的GNU通用公共許可證的條款,即許可證的版本2,或(根據您的選項)任何以後的版本。
LKM沙盒的分發是希望它將有用,但沒有任何保修;即使沒有對特定目的的適銷性或適合性的隱含保證。有關更多詳細信息,請參見GNU通用公共許可證。
您應該已經收到了GNU通用公共許可證的副本以及LKM Sandbox。如果沒有,請參見https://www.gnu.org/licenses/。