linux vdso int 0x80,Linux系统调用,libc,VDSO和实现解析

我在最后一个libc中剖析了syscall调用:

git clone git://sourceware.org/git/glibc.git

我在sysdeps / unix / sysv / linux / i386 / sysdep.h中有这个代码:

# define INTERNAL_SYSCALL_MAIN_INLINE(name,err,nr,args...) \

LOADREGS_##nr(args) \

asm volatile ( \

"call *%%gs:%P2" \

: "=a" (resultvar) \

: "a" (__NR_##name),"i" (offsetof (tcbhead_t,sysinfo)) \

ASMARGS_##nr(args) : "memory","cc")

如果我理解这段代码,那么LOADREGS _ ## nr(args)宏会将参数加载到寄存器ebx,ecx,edx,esi,edx和ebp中.

sysdeps / UNIX / SYSV / LINUX / I386 / sysdep.h中

# define LOADREGS_0()

# define ASMARGS_0()

# define LOADREGS_1(arg1) \

LOADREGS_0 ()

# define ASMARGS_1(arg1) \

ASMARGS_0 (),"b" ((unsigned int) (arg1))

# define LOADREGS_2(arg1,arg2) \

LOADREGS_1 (arg1)

# define ASMARGS_2(arg1,arg2) \

ASMARGS_1 (arg1),"c" ((unsigned int) (arg2))

# define LOADREGS_3(arg1,arg2,arg3) \

LOADREGS_2 (arg1,arg2)

# define ASMARGS_3(arg1,arg3) \

ASMARGS_2 (arg1,arg2),"d" ((unsigned int) (arg3))

# define LOADREGS_4(arg1,arg3,arg4) \

LOADREGS_3 (arg1,arg3)

# define ASMARGS_4(arg1,arg4) \

ASMARGS_3 (arg1,arg3),"S" ((unsigned int) (arg4))

# define LOADREGS_5(arg1,arg4,arg5) \

LOADREGS_4 (arg1,arg4)

# define ASMARGS_5(arg1,arg5) \

ASMARGS_4 (arg1,arg4),"D" ((unsigned int) (arg5))

# define LOADREGS_6(arg1,arg5,arg6) \

register unsigned int _a6 asm ("ebp") = (unsigned int) (arg6); \

LOADREGS_5 (arg1,arg5)

# define ASMARGS_6(arg1,arg6) \

ASMARGS_5 (arg1,arg5),"r" (_a6)

#endif /* GCC 5 */

enter code here

在ebx,edx和ebp寄存器中加载参数的代码在哪里?这是上面的代码吗?我不明白实施.

以下代码加载ebx寄存器中的第6个参数?

register unsigned int _a6 asm ("ebp") = (unsigned int) (arg6);

这段代码是什么:

ASMARGS_0 (),"b" ((unsigned int) (arg1))

它加载ebx寄存器中的第一个参数?

然后“call * %% gs:%P2”跳转到VDSO代码?这段代码对应“call * gs:0x10”?

那么,这个写系统调用的下图,它很好吗?:

write(1,"A",1) -----> LIBC -----> VDSO -----> KERNEL

load reg ?

jump to vdso

|---------------------------------------------------|--------------|

user land kernel land

我不懂VDSO实用程序! vdso选择syscall方法(sysenter或int 0x80).

提前谢谢你的帮助.抱歉,我的英语非常糟糕.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值