[英]Linux kernel : Current macro working
關於Linux內核中當前宏的工作(我指的是ARM體系結構)
當前宏的代碼:
return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
這意味着struct thread_info
位於堆棧的頂部?
這是來自linux Kernel開發的第3版:
struct thread_info
位於堆棧的底部(對於向下增長的堆棧)和堆棧頂部(對於成長的堆棧)。
如何通過覆蓋來阻止這個struct thread_info
?
THREAD_SIZE
是一個冪為2的常量,它給出了為線程堆棧分配的內存量。
~(THREAD_SIZE - 1)
然后給出一個位掩碼來刪除實際的堆棧地址。 例如。 對於8 kB堆棧,它將是0xffffff00。 通過按位並使用堆棧指針值, 我們得到為堆棧分配的最低地址 。
堆棧指針對於獲取線程信息很有用,因為每個線程總是有自己的堆棧。
它不受保護,不會被超限。
如果堆棧變得太大(堆棧溢出),它首先超出的是`struct thread_info,這很快會導致各種令人討厭的失敗。
因此在編寫內核代碼時,盡量使用盡可能少的堆棧空間,以避免溢出。
指向線程struct thread_info
指針放在內存的底部,該內存是為線程的內核堆棧保留的。 (每個線程都需要自己的堆棧,因此保證堆棧指針的值對於每個線程都是唯一的。)
沒有特殊的保護機制來防止覆蓋此指針,除了內核代碼不占用太多空間(並且中斷被切換到它們自己的堆棧)這一事實。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.