系统调用二

关于系统调用地举例:https://blog.csdn.net/YL970302/article/details/85677588

一、与内核通信

系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个:

(1)它为用户空间提供了一种硬件的抽象接口。举例来说,当需要读写文件的时候,应用程序就可以不去管磁盘类型和介质,甚至不用去管文件所在的文件系统到底是哪种类型

(2)系统调用保证了系统的稳定和安全。作为硬件设备和应用程序之间的中间人,内核可以基于权限、用户类型和其他一些规则对需要进行的访问进行裁决。举例:这样可以避免应用程序不正确的使用硬件设备,窃取其他进程的资源,或做出其他危害系统的事情。

(3)每个进程都运行在虚拟系统中,而在用户空间和系统的其余部分提供这样一层公共接口,也是处于这种考虑。如果应用程序可以随意访问硬件而内核又对此一无所知的话,几乎就没法实现多任务和虚拟内存,当然也不可能实现良好的稳定性和安全性。

二、API、POSIX和C库

一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程。这点很重要,因为应用程序使用的这种编程接口实际上并不需要和内核提供的系统调用对应。一个API定义了一组应用程序使用的编程接口。它们可以实现成一个系统调用,也可以通过多个系统调用来实现,而完全不使用任何系统调用也不存在问题。实际上,API可以在各种不同的操作系统上实现,给应用程序提供完全相同的接口,而它们本身在这些系统上的实现可能迥异。

三、系统调用处理程序

(1)用户空间的程序无法直接执行内核代码。它们不能直接调用内核空间的函数,因为内核驻留在受保护的地址空间上。如果进程可以直接在内核的地址空间上读的话,系统的安全性和稳定性将不复存在。

所以,应用程序应该以某种方式通知系统,告诉内核自己需要执行一个系统调用,希望切换到内核态,这样内核就可以代表应用程序在内核空间执行系统调用。

(2)通知内核的机制是靠软中断实现的:通过引发一个异常来促使系统切换到内核态去执行异常处理程序。此时的异常处理程序实际上就是系统调用处理程序。在x86的系统上预定义的软中断是中断号128,通过int$0X80指令触发该中断。这条指令会触发一个异常导致系统切换到内核态并执行第128号异常处理程序,而该程序正是系统调用处理程序。在这个处理程序名字起的很贴切,叫system_call().它与硬件体系结构紧密相关,x86-64的系统上在entry_64.S文件中用汇编语言编写。最近,x86处理器增加了一条叫做sysenter的指令。与int中断指令相比,这条指令提供了更快、更专业的陷入内核执行系统调用的方式。对这条指令的支持很快被加入内核。且不管系统调用处理程序被如何调用,用户空间引起异常或陷入内核就是一个重要的概念。

四、指定恰当的系统调用

因为所有的系统调用陷入内核的方式都一样,所以仅仅是陷入内核空间是不够的。因此必须把系统调用号一并传给内核。在x86上,系统调用号是通过eax寄存器传递给内核的。在陷入内核之前,用户空间就把相应系统调用所对应的号放入eax中。这样系统调用处理程序一旦运行就可以从eax中得到数据。system_call()函数通过将给定的系统调用号与NR_syscalls做比较来检查其有效性。如果前者大于或者等于后者,该函数就返回-ENOSYS。否则执行相应的系统调用

五、参数传递

除了系统调用号以外,大部分系统调用都还需要一些外部的参数输入。所以,在发生陷入的时候,应该把这些参数从用户空间传给内核。最简单的办法就是像传递系统调用号一样,把这些参数也存在寄存器里

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值