1 程序管理

2021-09-27 08:37:00 字數 2062 閱讀 3044

程序描述符獲取

通過thread_union,使程序核心態堆疊和thread_info緊密結合在一起。

檔案include/linux/sched.h當中,有thread_union的定義

union thread_union ;

之所以將thread_info結構稱之為小型的程序描述符,是因為在這個結構中並沒有直接包含與程序相關的字段,而是通過task欄位指向具體某個程序描述符。通常這塊記憶體區域的大小是8kb,也就是兩個頁的大小(有時候也使用乙個頁來儲存,即4kb)。乙個程序的核心棧和thread_info結構之間的邏輯關係如下圖所示:

從上圖可知,核心棧是從該記憶體區域的頂層向下(從高位址到低位址)增長的,而thread_info結構則是從該區域的開始處向上(從低位址到高位址)增長。核心棧的棧頂位址儲存在esp暫存器中。所以,當程序從使用者態切換到核心態後,esp暫存器指向這個區域的末端。

因為乙個頁大小是4k,乙個頁的起始位址都是4k的整數倍,即後12位都為0,取得esp核心棧棧頂的位址,將其後12位取0,就可以得到上述記憶體區域的起始位址0x015fa000,該位址即是thread_info的位址,通過thread_info又可以得到task_struct的位址進而得到程序pid。

從**的角度來看,核心棧和thread_info結構是被定義在乙個聯合體當中的:

union thread_union ;

其中,thread_size的值取8192時,stack陣列的大小為2048;thread_size的值取4096時,stack陣列的大小為1024。現在我們應該思考,為何要將核心棧和thread_info(其實也就相當於task_struct,只不過使用thread_info結構更節省空間)緊密的放在一起?最主要的原因就是核心可以很容易的通過esp暫存器的值獲得當前正在執行程序的thread_info結構的位址,進而獲得當前程序描述符的位址。

/* how to get the thread information struct from c */

static inline struct thread_info *current_thread_info(void)

直接返回thread_info指標,當前的堆疊指標current_stack_pointer,也就是esp,thread_size為塊的位元組大小

8192或者是4096,這裡假設值8192,十六進製制的表示是0x00002000,二進位制的表示是00000000000000000010000000000000

~(thread_size-1)的結果剛好為1111111111111111111 0000000000000,第十三位是全為零,也就是剛好遮蔽了esp的低十三位,最終得到的是thread_info的位址。

可以用組合語言描述,更加直觀:

movl $0xffffe000, %ecx

andl $esp, %ecs

movl $ecs, p

(最後p中就包含了,thread_info的位址了)這條彙編語句會遮蔽掉esp暫存器中的核心棧頂位址的低13位(或12位,當thread_size為4096時)。此時ti所指的位址就是這片記憶體區域的起始位址,也就剛好是thread_info結構的位址。但是,thread_info結構的位址並不會對我們直接有用。我們通常可以輕鬆的通過current巨集獲得當前程序的task_struct結構,這個巨集是如何實現的?

通過上述原始碼可以發現,current巨集返回的是thread_info結構task欄位。而task正好指向與thread_info結構關聯的那個程序描述符。得到current後,我們就可以獲得當前正在執行程序的描述符中任何乙個欄位了,比如我們通常所做的:current->pid。

程序管理(1)

程序是處於執行期的程式,程序包括 段,資料段,還有pcb 程序控制塊 執行緒實在程序中活動的物件,核心排程的物件是執行緒,而不是程序 注意 linux核心通常把程序叫做任務核心把程序的列表存放在任務佇列中 雙向迴圈鍊錶 鍊錶中的每一項型別都是task struct 稱為程序描述符 程序描述符包含乙個...

Linux程序管理(1)

程序是執行期間的程式及其它所包含的資源的總稱。程序通過 fork 系統呼叫產生,該系統呼叫通過複製乙個現有程序來建立乙個全新的程序。fork 呼叫一次返回兩次 一次回到父程序 一次回到新建立的子程序。程序描述符及任務結構 核心把程序放在 task list 的雙向迴圈鍊錶中,其中每一項都是乙個 ta...

Linux程序管理1

程序是已啟動的可執行程式的執行中例項。proc目錄下以數字為名的目錄,每乙個目錄代表乙個程序,儲存著程序的屬性資訊。每乙個程序的pid是唯一的,就算程序退出了,其它程序也不會占用其pid。1.1程序的組成部分 已分配記憶體的位址空間 安全屬性,包括所有權憑據和特權 程式 的乙個或多個執行執行緒 程序...