免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1642 | 回复: 3
打印 上一主题 下一主题

[内核入门] (&irq)[-1] 疑问? [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-28 10:10 |只看该作者 |倒序浏览
arch/i386/kernel/irq.c, line 662~705:
  1. int request_irq(unsigned int irq,
  2.                 void (*handler)(int, void *, struct pt_regs *),
  3.                 unsigned long irqflags,
  4.                 const char * devname,
  5.                 void *dev_id)
  6. {
  7.         ...

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

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

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

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
2 [报告]
发表于 2016-07-28 10:28 |只看该作者
本帖最后由 _nosay 于 2016-07-28 13:37 编辑

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

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

  7. void caller()
  8. {
  9.         printf("caller %p\n", caller);  // objdump
  10.         fun(0);
  11. }

  12. int main()
  13. {
  14.         caller();
  15.         return 0;
  16. }
复制代码
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)[1],每次执行不一样

xx@HP-xx:~/test/12$ objdump -j .text -S a.out
  1. void caller()
  2. {
  3.   400570:       55                      push   %rbp
  4.   400571:       48 89 e5                mov    %rsp,%rbp
  5.         fun(0);
  6.   400574:       bf 00 00 00 00          mov    $0x0,%edi
  7.   400579:       e8 af ff ff ff          callq  40052d <fun>
  8. }
  9.   40057e:       5d                      pop    %rbp
  10.   40057f:       c3                      retq
复制代码

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
3 [报告]
发表于 2016-07-28 18:09 |只看该作者
这是64位机器吧,在不优化的情况下,fun会把参数临时拷贝到栈上,&得到的是临时变量的地址(栈地址)。

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

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
4 [报告]
发表于 2016-07-29 10:01 |只看该作者
回复 3# nswcfd

嗯,我用的是64位系统。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP