第四十一天 Linux核心棧

2021-07-13 07:18:24 字數 1775 閱讀 1126

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...