【问题标题】:Linux kernel : Current macro workingLinux内核:当前宏工作
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案2】:

它不受溢出保护。

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      相关资源
      最近更新 更多