C Linux内核:当前宏工作

C Linux内核:当前宏工作,c,linux-kernel,C,Linux Kernel,关于Linux内核中当前宏的工作(我指的是ARM架构) 当前宏的代码: return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); 这意味着struct thread\u info被放置在堆栈的顶部 这来自linux内核开发第3版: struct thread_info位于堆栈底部(对于向下生长的堆栈)和堆栈顶部(对于向上生长的堆栈) 如何通过被覆盖来防止此struct thread\u info?thread\u SIZE是一个2次

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

当前宏的代码:

return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
这意味着
struct thread\u info
被放置在堆栈的顶部

这来自linux内核开发第3版:

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


如何通过被覆盖来防止此
struct thread\u info

thread\u SIZE
是一个2次方的常数,它给出了为线程堆栈分配的内存量

  • 表达式
    ~(THREAD\u SIZE-1)
    然后给出一个位掩码,用于去除实际堆栈地址。对于8KB堆栈,它将是0xffffff00
通过采用按位and和堆栈指针值,我们得到为堆栈分配的最低地址


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

指向线程的
struct thread\u info
的指针位于为线程内核堆栈保留的内存底部。 (每个线程都需要自己的堆栈,因此堆栈指针的值对于每个线程都是唯一的。)


没有特殊的保护机制来防止重写此指针,除了内核代码不使用太多空间(中断被切换到它们自己的堆栈)这一事实之外。

它不受溢出保护

如果堆栈太大(堆栈溢出),它溢出的第一件事就是“struct thread\u info”,这很快就会导致各种严重的故障


因此,在编写内核代码时,尽可能使用少量堆栈空间,以避免溢出。

我认为:
(sp&~(THREAD_SIZE-1))检查线程id是否为奇数。代码检查最后一位是否为1。@GrijeshChauhan:我不确定它是否为1,我这样说是因为此代码的用法如下:current\u thread\u info()->task我自己无法理解这一点,但我理解
(sp&~(thread\u SIZE-1)
检查最后一位是否为1。假设
线程大小
是2的幂,比如
0x100
。那么
(线程大小-1)
将为
0xff
(线程大小-1)`将同一掩码反转:
0xfffffff00
因此,宏掩码将从最低位开始。当前结构可能位于堆栈的较低大小(假设sp是堆栈指针,或指向线程结构数组的指针)唯一使这个ARM特定的是用于获取堆栈指针的寄存器。即,在ARM上,它是
sp
,而在PowerPC上,它是
R1
,等等。在大多数(所有?)上使用相同的概念体系结构。感谢您的澄清,同意,因此您可以获得thread_信息的起始地址,从那里我们也可以获得任务,但是覆盖保护呢?@LeoMessi我不确定。这可能会对您有所帮助