_nosay 发表于 2016-07-28 10:10

(&irq)[-1] 疑问?

arch/i386/kernel/irq.c, line 662~705:int request_irq(unsigned int irq,
                void (*handler)(int, void *, struct pt_regs *),
                unsigned long irqflags,
                const char * devname,
                void *dev_id)
{
        ...

        if (irqflags & SA_SHIRQ) {
                if (!dev_id)
                        printk("Bad boy: %s (at 0x%x) called us without a dev_id!\n", devname, (&irq)[-1]);
        }

        ...
}hi~ 关于(&irq)[-1],我的疑问是这样:
1. 某些优化级别,部分参数通过寄存器传递
2. 函数有不同的调用约定:
http://blog.csdn.net/jia_xiaoxin/article/details/2868216

这里没有考虑这些,直接就认为第一个参数前面就是caller的地址了。

_nosay 发表于 2016-07-28 10:28

本帖最后由 _nosay 于 2016-07-28 13:37 编辑

回复 1# _nosay #include <stdio.h>

void fun(int arg)
{
      printf("called by 0x%x\n", (&arg)[-1]);
      printf("called by 0x%x\n", (&arg));
}

void caller()
{
      printf("caller %p\n", caller);// objdump
      fun(0);
}

int main()
{
      caller();
      return 0;
}
xx@HP-xx:~/test/12$ gcc test.c -O0 -g -Wall
xx@HP-xx:~/test/12$ ./a.out
caller 0x400570         // 看后面objdump结果
called by 0xd4962e80// (&arg)[-1],每次执行不一样
called by 0xa0d1fd30   // (&arg),每次执行不一样

xx@HP-xx:~/test/12$ objdump -j .text -S a.outvoid caller()
{
400570:       55                      push   %rbp
400571:       48 89 e5                mov    %rsp,%rbp
      fun(0);
400574:       bf 00 00 00 00          mov    $0x0,%edi
400579:       e8 af ff ff ff          callq40052d <fun>
}
40057e:       5d                      pop    %rbp
40057f:       c3                      retq

nswcfd 发表于 2016-07-28 18:09

这是64位机器吧,在不优化的情况下,fun会把参数临时拷贝到栈上,&得到的是临时变量的地址(栈地址)。

386的代码假设第一个参数(最后一个压栈)上面是返回地址,这个似乎是合理的?

_nosay 发表于 2016-07-29 10:01

回复 3# nswcfd

嗯,我用的是64位系统。
页: [1]
查看完整版本: (&irq)[-1] 疑问?