关于Linux内核中当前宏的工作(我指的是ARM架构)
当前宏的代码:
return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
这意味着struct thread_info
位于堆栈的顶部?
这是来自linux Kernel开发的第3版:
struct thread_info
位于堆栈的底部(对于长大的堆栈)和堆栈的顶部(对于长大的堆栈)。
覆盖后如何阻止此struct thread_info
?
答案 0 :(得分:2)
THREAD_SIZE
是一个幂为2的常量,它给出了为线程堆栈分配的内存量。
~(THREAD_SIZE - 1)
然后给出一个位掩码,用于删除实际的堆栈地址。例如。对于8 kB堆栈,它将是0xffffff00。通过按位并使用堆栈指针值,我们得到为堆栈分配的最低地址。
堆栈指针对于获取线程信息很有用,因为每个线程总是有自己的堆栈。
答案 1 :(得分:1)
不受过度保护。
如果堆栈变得太大(堆栈溢出),它首先超出的是`struct thread_info,这很快会导致各种令人讨厌的失败。
因此,在编写内核代码时,尽可能使用一点堆栈空间,以避免超出。
答案 2 :(得分:0)
指向线程struct thread_info
的指针位于为线程内核堆栈保留的内存底部。
(每个线程都需要自己的堆栈,因此保证堆栈指针的值对每个线程都是唯一的。)
没有特殊的保护机制来防止覆盖此指针,除了内核代码不占用太多空间(并且中断被切换到自己的堆栈)这一事实。