1

关于当前宏在 Linux 内核中的工作(我指的是 ARM 架构)

当前宏的代码:

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

这意味着struct thread_info被放置在堆栈的顶部?

这是来自 linux Kernel development 3rd edition :

struct thread_info位于堆栈底部(对于向下增长的堆栈)和堆栈顶部(对于向上增长的堆栈)。

如何struct thread_info通过覆盖来防止这种情况?

4

3 回答 3

2

THREAD_SIZE是一个 2 次幂的常数,它给出了分配给线程堆栈的内存量。

  • 然后,该表达式~(THREAD_SIZE - 1)给出了一个位掩码,用于消除实际的堆栈地址。例如。对于 8 kB 堆栈,它将是 0xffffff00。

通过按位和堆栈指针值,我们得到分配给堆栈的最低地址

堆栈指针对于获取线程信息很有用,因为每个线程总是有自己的堆栈。

于 2013-10-13T18:19:57.790 回答
1

它不受溢出保护。

如果堆栈变得太大(堆栈溢出),它首先溢出的是`struct thread_info,这很快就会导致各种令人讨厌的故障。

所以在编写内核代码时,尽量少用堆栈空间,避免溢出。

于 2013-10-14T09:15:50.953 回答
0

指向线程的指针struct thread_info放置在为线程的内核堆栈保留的内存的底部。(每个线程都需要自己的堆栈,因此堆栈指针的值对于每个线程都保证是唯一的。)

没有特殊的保护机制来防止覆盖这个指针,除了内核代码不使用太多空间空间(并且中断被切换到自己的堆栈)这一事实。

于 2013-10-13T18:35:57.590 回答