《Linux内核分析》实践2
生活随笔
收集整理的這篇文章主要介紹了
《Linux内核分析》实践2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
《Linux及安全》實踐2
一、Linux基本內核模塊
1.1什么是內核模塊
- linux模塊是一些可以作為獨立程序來編譯的函數和數據類型的集合。之所以提供模塊機制,是因為Linux本身是一個單內核。單內核由于所有內容都集成在一起,效率很高,但可擴展性和可維護性相對較差,模塊機制可彌補這一缺陷。
- Linux模塊可以通過靜態或動態的方法加載到內核空間,靜態加載是指在內核啟動過程中加載;動態加載是指在內核運行的過程中隨時加載。(我們要做的實踐內容就是動態加載內核模塊)
- 一個模塊被加載到內核中時,就成為內核代碼的一部分。模塊加載入系統時,系統修改內核中的符號表,將新加載的模塊提供的資源和符號添加到內核符號表中,以便進行模塊間的通信。
1.2.c程序編寫
- 具體代碼如下(打印學號):
解釋:
(1)關于 #include <linux/init.h>以及#include <linux/module.h>是編寫內核模塊程序所必須的2個頭文件。
(2)編寫內核模塊時必須要有的兩個函數 :
static int init_fun(void){// 初始化代碼} 函數實例:static int hello_init(void)// 不加void在調試時會出現報警{printk("hello world!/n");return 0;}- 卸載函數(出口函數) 無返回值static void cleaup_fun(void){// 釋放代碼}
- 加載函數:(3)printk是內核態信息打印函數,功能和比標準C庫的printf類似
(5)module_init(fun):告訴內核模塊程序從何處開始執行。module_exit(fun):告訴內核編寫模塊程序從何處離開。
(6)模塊許可聲明:函數原型是MODULE_LICENSE(),告訴內核該程序使用的許可證,一般是GPL。
1.3Makefile編寫
- 其中make -C $(LINUX_KERNEL_PATH) 指明跳轉到內核源碼目錄下讀取Makefile
M=$(CURRENT_PATH) 表明返回到當前目錄繼續執行當前的Makefile(M= 后指定的是 lwr.c 和 Makefile 所在的目錄) - 關于個人虛擬機的內核版本號,輸入指令“uname - a”可查看,在usr/src中可找到
1.4操作
- 輸入make進行自動編譯;編譯之后,生成需要的文件
- 輸入sudo insmod lwr.ko,加載模塊(root權限)
- 輸入dmesg,測試模塊輸出
- 卸載模塊:“sudo rmmod 模塊名” 之后,就將內核中之前加載的模塊刪除,此時再輸入dmesg測試,可以看到顯示了exit信息
二、Linux內核模塊的功能實現
1.實現輸出當前進程信息的功能
- 代碼如下:
- 結果如下:
溫馨提示需要改一下makefile哦,代碼里使用了printk函數打印了進程的pid、state等信息
2.實現讀取進程鏈表的功能
- 代碼如下:
- 結果如下:
- 這個與上述不同的地方在于要打印進程鏈表的,所以需要一個循環,連續打印
for_each_process()的函數本質即for循環,從第一個PCB(init_task)開始,順著pcurrent鏈表進行遍歷,輸出所有當前進程的信息(pid,tgid等)。
轉載于:https://www.cnblogs.com/shadow135211/p/5525441.html
總結
以上是生活随笔為你收集整理的《Linux内核分析》实践2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS3定位和浮动详解
- 下一篇: linux下开发问题汇总