系统调用和普通函数中参数的调用方式

普通函数的调用(或是内核进程的普通函数调用),参数的传递是通过压入栈的方式实现;
汇编指令CALL之后,会入栈下一条指令的地址eip,要是要传递参数或是保护一些关键的上下文信息,需要顺序入栈相应的寄存器的值;
再使用ebp来从栈中取出要用的参数,或是用pop来出栈参数

系统调用int 0x80是去系统的中断向量表找到第0x80h位置,然后根据eax的值来确定是第几号系统调用功能,这里的参数是通过寄存器来传递的;
为什么这里用寄存器传递而不用堆栈呢?因为系统调用过程是一个进程在用户态使用int80进入内核态,这个过程有进程堆栈到进程内核堆栈的切换,没办法跨堆栈传递;

这里回顾下CALL和INT的区别:
CALL汇编调用:
1.要将下一条指令的EIP压入栈(若是段间还要将CS也入栈)
2.需要手写对上下文的保护,并未有硬件自动的保护

INT中断过程:
1.通过TR指向的TSS找到调用中断的进程内核栈的位置
2.硬件自动的上下文入栈(eax,ebx…)保护,压入进程内核栈
3.执行中断子程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值