2011-10-05 76 views
3

我正在使用內核堆棧的esp值來計算進程描述符指針值。 根據ULK書,我只需要屏蔽esp的13個最低有效位,以獲得thread_info結構的基地址。 我的測試是:進程描述符指針與Linux內核中的當前宏不匹配

  1. 編寫內核模塊,因爲我需要的內核堆棧
  2. 的值在內核初始化函數,得到的內核堆棧
  3. 使用的值下面的公式來獲取進程描述符運行在CPU上的進程的指針:*((unsigned int*) esp & 0xffffe000)
  4. 使用當前宏,打印出其值。

我認爲第3步的價值應該是同步驟4

的價值,但我的實驗結果表明:有時他們是相同的,有時它們是不同的。有沒有解釋爲什麼?或者我錯過了什麼?

+1

[Kernelnewbies描述了current()是如何工作的](http://kernelnewbies.org/FAQ/current),可能會有所幫助。 – sarnold

回答

0

最後,我解決了這個問題。對於內核堆棧的大小,一切都是正確的。我的內核使用4KB堆棧而不是8KB堆棧。所以我只需要屏蔽ESP的低12位。 感謝您的所有建議和答案!

1

這是因爲在內核堆棧的基礎上,您會發現一個struct thread_info實例(依賴於平臺)和而不是 a struct task_structcurrent()宏提供了一個指向當前的task_struct的指針。

嘗試以下操作:

struct thread_info *info = (struct thread_info*)(esp & 0xfffe000); 
struct task_struct *my_current = info->task; 

現在你可以用current()比較my_current

+0

您的代碼與*((unsigned int *)esp&0xffffe000)相同,因爲thread_info的第一個字段是task。 –