linux3.5核心中為所有程序(包括核心程序和使用者程序)分配8k或4k的核心棧(可以在核心編譯的時候選擇),在模組**中分配的棧記憶體就是在核心棧中,寫模組**如果要在堆中分配記憶體,則要使用kmalloc或vmalloc來分配,這是後話。
核心棧的棧底存放這thread_info, 通過獲取核心棧,以得到thread_info的資訊,thread_info裡面有乙個指向task_struct (程序描述符, 裡面放著程序的各種資訊)的指標, 通過這個指標, 就可以獲取程序的各種資訊了。
先編寫獲取當前程序名的程式,來更好的了解核心棧。
1 #include 2 #include 3 #include 4 #include 5編譯成模組,在開發板執行結果如下;6 module_license("
gpl"
);7 module_author("
bunfly");
89inttest_init()
1019
20void
test_exit()
2124
25module_init(test_init);
26 module_exit(test_exit);
下面來解釋下關鍵**:
第十一行;在核心棧上定義乙個整型變數i
第十二行,定義指向thread_info結構體指標p
第十三行:根據上圖所示 ,已知thread_info結構體在核心棧的棧底,整型變數i在棧上,可以獲得i的位址,核心棧的大小是8k。求thread_info結構體
的位址。方法就是第十三行**:將i強制轉換成unsigned long 型,再將後面13位置零,再強轉為thread_info結構體
指標。要理解為什麼這樣並不難。聯想下記憶體的段頁式儲存,記憶體位址中前面為基位址,後面是偏移量,核心棧的大小是8k。說明是以8k大小作為偏移量的。後13位置零就是求出基位址,而thread_info結構體
是在棧底的,也就是說,基位址就是thread_info結構體
的位址。
第十四行定義記憶體描述符task_struct結構體指標t,並儲存thread_info結構體中task的位址。
第十五行輸出程序名稱。
系統中所有的程序連成乙個雙向迴圈鍊錶,現在我們就通過已經找到程序描述符來輸出系統中所有的程序名。
container_of巨集在核心中應用很廣,一定要看懂。
學習python 第四十一天
python 對檔案的處理 python open 函式用於開啟乙個檔案,建立乙個 file 物件,相關的方法才可以呼叫它進行讀寫。response的常用方法 response.text str 文字資料 可以根據http頭部對響應的編碼來進行解碼 response.content bytes型的二...
NeHe OpenGL第四十一課 體積霧氣
nehe opengl第四十一課 體積霧氣 體積霧氣 把霧座標繫結到頂點,你可以在霧中漫遊,體驗一下吧。這一課我們將介紹體積霧,為了執行這個程式,你的顯示卡必須支援擴充套件 gl ext fot coord include include include include include nehegl...
LeetCode第四十一題 Python實現
title leetcode no.41 categories tags 給你乙個未排序的整數陣列 nums 請你找出其中沒有出現的最小的正整數。高階 你可以實現時間複雜度為 o n 並且只使用常數級別額外空間的解決方案嗎?示例 1 輸入 nums 1,2,0 輸出 3 示例 2 輸入 nums 3...