文章目录
系统调用
系统调用功能概述
1.什么是系统调用?
- OS内核中都有一组实现系统功能的过程,系统调用就是对上述过程的调用。
- 编程人员利用系统调用,向OS提出服务请求,由OS代为完成。
- 一般情况下,进程是不能够存取系统内核的,它不能存取内核使用的内存段,也不能调用内核函数,CPU的硬件结构保证了这一点,只是系统调用是个例外。
2.系统调用提供哪些功能?
系统调用是用户态进入内核态的唯一入口,常用的系统调用有:
- write/read调用
- 设置系统状态或读取内核数据:getpid(), getpriority(), setpriority(), sethostname()等
- 进程管理相关:fork(), clone(), execve(), exit()等
3.提供系统调用有何优点?
系统调用其实和我们用的函数库一样,只不过这里的函数库很特殊,其涉及到硬件设备,所以系统调用的优点是:
- 编程容易,从硬件设备的低级编程中解脱出来
- 只有使用系统调用才能接触到内核,提高了系统的安全性,可以先检查请求的正确性,然后再执行
系统调用的处理过程
- Linux实现系统调用利用了i386体系结构中的软中断,即调用了int 0x80汇编指令。
- 这条汇编指令产生向量为128的异常,CPU便切换到内核状态执行内核函数:system_call()。
- int 0x80指令将用户态的执行模式转变成内核态,并将控制权交给系统调用过程的起点system_call()处理函数。
system_call()函数
- system_call()函数首先检查系统调用号,该号码告诉内核进程请求哪种服务。
- 内核进程查看系统调用表sys_call_table找到所调用的内核函数入口地址。
- 接着调用相应的函数,在返回后做一些系统检查,最后返回到进程。
文字描述太无聊了,翻了翻Linux0.11版内核,看看它们怎么实现的叭:
- 我发现system_call是用汇编实现的,对应system_call.s文件,大概就是下面这样:
还有一个片段:
表示Linux0.11版内核有72个系统调用!
system_call具体的执行过程见下图,上面的代码就不解析了,还是比较容易理解的!