2013-10-13 90 views
1

關於當前宏觀經濟的Linux內核的工作(我指的是ARM架構)Linux內核:目前的宏觀工作

當前宏代碼:

return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); 

這意味着struct thread_info放置在堆棧頂部?

這是Linux內核開發第三版:

struct thread_info生活在堆棧的底部(對於向下生長棧),並在堆棧的頂部(對於成長堆棧)。

這個struct thread_info如何被覆蓋防止?

+0

我想:'(sp&〜(THREAD_SIZE - 1));'檢查是否有奇數個線程ID。代碼檢查的最後一位是1。 –

+0

@GrijeshChauhan:我不確定是否這樣說,因爲進一步使用這樣的代碼是這樣的: current_thread_info() - >任務 –

+0

我自己無法理解這一點,但我明白'(sp&〜(THREAD_SIZE - 1)'檢查最後一位是否爲1 –

回答

2

THREAD_SIZE是一個2的冪的常量,它給出了線程堆棧的內存分配量。

  • 然後表達式~(THREAD_SIZE - 1)給出了一個用於擺脫實際堆棧地址的位掩碼。例如。對於8 kB堆棧,它將是0xffffff00。

通過採取按位和堆棧指針的值,我們得到分配堆棧最低的地址。

堆棧指針對獲取線程信息很有用,因爲每個線程總是有自己的堆棧。

+0

感謝澄清,同意所以你得到thread_info的起始地址,從那裏我們也得到任務,但覆蓋保護呢? –

+0

@LeoMessi我不確定。這可能會幫助你http://stackoverflow.com/questions/6270945/linux-stack-sizes –

0

指向線程的struct thread_info的指針位於爲線程的內核堆棧保留的內存底部。 (每個線程都需要自己的堆棧,因此堆棧指針的值保證對每個線程都是唯一的)。

沒有特殊的保護機制來防止覆蓋這個指針,除了內核代碼沒有太多用處空間空間(並且中斷切換到他們自己的堆棧)。

1

它沒有被保護免於溢出。

如果堆棧變得太大(堆棧溢出),它超出的第一件事是`struct thread_info,它很快會導致各種令人討厭的失敗。

因此,在編寫內核代碼時,儘可能使用小的堆棧空間來避免溢出。