【发布时间】:2013-10-16 03:25:43
【问题描述】:
关于当前宏在Linux内核中的工作(我指的是ARM架构)
当前宏的代码:
return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
这意味着struct thread_info被放在栈顶?
这是来自 linux Kernel development 3rd edition :
struct thread_info 位于堆栈底部(对于向下增长的堆栈)和堆栈顶部(对于向上增长的堆栈)。
如何防止struct thread_info 被覆盖?
【问题讨论】:
-
我认为:
(sp & ~(THREAD_SIZE - 1));检查线程id是否为奇数。代码检查最后一位是一。 -
@GrijeshChauhan :我不确定是否这样做,因为我这样说是因为进一步使用此代码:current_thread_info()->task
-
我自己无法理解这一点,但我知道
(sp & ~(THREAD_SIZE - 1)检查最后一位是否为 1。 -
假设
THREAD_SIZE是2 的幂,比如0x100。那么(THREAD_SIZE-1)将是0xff。 ~(THREAD_SIZE-1)` 将是相同的掩码反转:0xfffffff00所以,宏掩码掉最低位。当前结构可能位于堆栈的较小大小(假设 sp 是堆栈指针,或者指向线程结构数组的指针) -
唯一使这个ARM 特定的是用于获取堆栈指针 的寄存器。即,在ARM 上,它是
sp,而在PowerPC 上,它是R1,等等。大多数(所有?)架构都使用相同的概念。
标签: c linux-kernel