Search Google

Thursday, June 12, 2008

[Process Management] task_struct中存放哪些關鍵資訊?

專門用語:

  • 使用打字機(Courier New)字體表示原始碼。
  • task/process即為Linux中的thread。
  • 文中的Linux與Linux kernel指的皆為作業系統核心。
  • 使用斜體字型標示Linux中的資料結構,變數或函式名稱。
  • PID即為TID。

Kernel版本:
  • v2.6.24.3

佔了1.7KBytes記憶體空間的task_struct可以存放許多資訊,其中包含許多對保持作業系統正成運作而言並非必要1的資訊,如統計或其他功能數據utimestimeutimescaledstimescaled。。。等。究竟哪些才是會影響task運作的關鍵資訊呢?讓我們看看Linux在呼叫工作排程將current task暫停而開始執行另一個task(稱之為context switch)之前保存哪些資訊。Linux的工作排程函式叫做schedule,真正發生context switch的部分出現在switch_to macro中,switch_to在執行context switch(jmp __switch_to)之前先將CPU暫存器中的值存到current task的task_struct中:

#define switch_to(prev,next,last) do { \
unsigned long esi,edi; \
asm volatile("pushfl\n\t" /* Save flags */ \
"pushl %%ebp\n\t" \
"movl %%esp,%0\n\t" /* save ESP */ \
"movl %5,%%esp\n\t" /* restore ESP */ \
"movl $1f,%1\n\t" /* save EIP */ \
"pushl %6\n\t" /* restore EIP */ \
"jmp __switch_to\n" \
"1:\t" \
"popl %%ebp\n\t" \
"popfl" \
:"=m" (prev->thread.esp),"=m" (prev->thread.eip), \
"=a" (last),"=S" (esi),"=D" (edi) \
:"m" (next->thread.esp),"m" (next->thread.eip), \
"2" (prev), "d" (next)); \
} while (0)
eip為program counter,有關esp,ebp的作用請參考orca大大(orca dot chen at gmail dot com)的comment。
有 了這些暫存器中的資訊,當下次發生context switch恢復某個被暫停執行的task時,Linux可以知道該從記憶體的哪個位址繼續執行,並知道該task該從什麼狀態繼續執行,因為task使 用到的區域變數都存放在堆疊中。少了這些核心資料多工作業環境絕對無法正常運作,然而為了增加核心的運作效能task_struct中因而存放其他資訊,如state,pid,prio,static_prio,normal_prio。。。等。

2 comments:

Miles MH Chen said...

ebp好像是為了方便操作stack上面的local variable & function args才有的,因為esp是變動的,但是stack上面那些變數是固定的,用一個固定的ebp就可以方便操作那些變數。

1)function call之前,caller會push args進去stack
2)call instruction會把return address push到stack裡面,然後junp過去
3)function一開始會先push ebp的值(保留caller的ebp),接著把esp複製到ebp裡面,這樣就可以以ebp為準,很固定的存取args
3.1)local variable會從ebp下面開始push
3.2)return之前記得restore ebp


James哥要開linux kernel課程嗎?會爆滿喔~

t@c0 said...

看來年紀大了沒有仔細看還是會出包。
果然三日不讀書面目可憎阿!