4

在 do_IRQ 你可以找到下面的代码!

#ifdef CONFIG_DEBUG_STACKOVERFLOW
   /* Debugging check for stack overflow: is there less than 1KB free? */
    {
       long esp;

        __asm__ __volatile__("andl %%esp,%0" :
                "=r" (esp) : "0" (THREAD_SIZE - 1));
       if (unlikely(esp < (sizeof(struct thread_info) + STACK_WARN))) {
           printk("do_IRQ: stack overflow: %ld\n",
                esp - sizeof(struct thread_info));
            dump_stack();
        }
    }
#endif

我不明白这个 asm 程序集
asm _ volatile _("andl %%esp,%0" : "=r" (esp) : "0" (THREAD_SIZE - 1)); THREAD_SIZE - 1 是什么意思?我记得括号里的符号应该是像输出部分的esp一样的C变量,但是在输入部分它看起来像一个整数而不是C符号,请大家帮忙

4

1 回答 1

3

"0"约束意味着:使用与第 0 个操作数相同的约束(http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss6.16.1.3 匹配(数字)约束)。

基本上,这个片段THREAD_SIZE - 1作为一个输入寄存器,并在同一个寄存器中输出一个与值。该寄存器esp在源代码中作为变量引用。

于 2014-02-20T10:59:07.997 回答