Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2161547
  • 博文数量: 361
  • 博客积分: 10828
  • 博客等级: 上将
  • 技术积分: 4161
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-20 14:34
文章分类

全部博文(361)

文章存档

2011年(132)

2010年(229)

分类: LINUX

2010-02-26 20:03:21

// 以下定义系统调用嵌入式汇编宏函数。
// 不带参数的系统调用宏函数。type name(void)。
// %0 - eax(__res),%1 - eax(__NR_##name)。其中name 是系统调用的名称,与 __NR_ 组合形成上面
// 的系统调用符号常数,从而用来对系统调用表中函数指针寻址。
// 返回:如果返回值大于等于0,则返回该值,否则置出错号errno,并返回-1。
#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__ volatile ( "int $0x80" \        // 调用系统中断0x80。
:"=a" (__res) \                // 返回值??eax(__res)。
:"" (__NR_
##name)); \                        // 输入为系统中断调用号__NR_name。
      if (__res >= 0) \                // 如果返回值>=0,则直接返回该值。
      return (type) __res; errno = -__res; \        // 否则置出错号,并返回-1。
      return -1;}


问题1:内联汇编Input里引号部分通常是约束部分,像“a”,"b"...这里:"" (__NR_##name)); 没有明确用什么约束是什么意思?
可以看成现在标准的:"0"(__NR_##name),这里,就相当于"a"(__NR_##name).

问题2:(__NR_##name)如果我调用 _syscall0(int,fork)替代进去不是变成__NR_##fork了吗?但系统调用常数符号的定义是#define __NR_fork 2啊,其中##是干嘛的?
##的意思就是宏中的字符直接替换,
如果name = fork,那么在宏中__NR_##name就替换成了__NR_fork了。

__NR_##name是系统调用号,##指的是两次宏展开.即用实际的系统调用名字代替"name",然后再把__NR_...展开.如name == ioctl,则为__NR_ioctl


 
阅读(3880) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~