Linux操作系统--系统调用

1、应用程序一般不直接使用系统调用,而是使用API(应用程序编程接口)。POSIX标准定义了API 。Linux的API使用C库实现。

2、系统调用返回值:返回负值表示错误,0表示成功。错误时,将错误码写入error全局变量。可以通过库函数perror()打印。

3、系统调用只能从中获取函数参数。使用了asmlinkage 限定词。?[LKD--P59]

4、系统调用的处理程序也即是int $0x80软中断的中断/异常服务程序。并且系统调用号通过exa寄存器传送给内核。系统调用参数传递:其他通用寄存器:ebx, ecx, edx, esi, edi.

5、在进程上下文中,内核可以休眠并且可以被抢占,这两点都很重要。可以休眠说明系统调用可以使用内核提供的绝大部分功能;可以被抢占说明像用户空间的进程一样,当前的进程同样可以被抢占,应该保证系统调用时可重入的。

 

用户代码->中断->中断服务程序->系统调用表->系统调用->用户代码

普通C函数的参数传递是通过把参数值写入活动的程序栈(用户栈和内核栈),因为系统调用是一种横跨用户和内核两大陆地的特殊函数,所以不既不能用用户栈也不能用内核栈。更确切的说,系统调用之前,将参数保存在寄存器中,然后调用服务例程之前再讲寄存机保存在内核栈中(SAVE_ALL),这是因为系统调用服务例程是普通的C函数。【这些寄存器的值并不是硬件自动保存,中断触发,硬件自动保存 CS IP FLAG/cpsr三个寄存器】

关于Linux用户进程向系统中断调用过程传递参数方面,Linux系统使用了通用寄存器传递方法,例如寄存器ebx、ecx和edx。这种使用寄存器传递参数方法的一个明显优点就是:当进入系统中断服务程序而保存寄存器值时,这些传递参数的寄存器也被自动地放在了内核态堆栈上,因此用不着再专门对传递参数的寄存器进行特殊处理。

 

在函数system_call中,一开始就使用宏save_all把处理器的各寄存器压栈(内核栈),以便以后系统调用服务例程可从内核堆栈中根据 需要找到相关的参数。 

 

 

linux新形系统调用: sysenter.直接跳到某个寄存器指定的函数执行。【X86新增加指令】

https://www.cnblogs.com/gm-201705/p/9863927.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值