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.1、および 6.1.3 Matching(Digit) 制約)。

基本的に、このスニペットはTHREAD_SIZE - 1入力レジスターとして受け取り、同じレジスターで論理積値を出力します。このレジスタはesp、ソース コードでは変数として参照されます。

于 2014-02-20T10:59:07.997 に答える