一、
Syscall
意义
内核提供用户空间程序与内核空间进行交互的一套标准接口,
这些接口让用户态程序能受
限访问硬件设备,
比如申请系统资源,
操作设备读写,
创建新进程等。
用户空间发生请求,
内核空间负责执行,
这些接口便是用户空间和内核空间共同识别的桥梁,这里提到两个字
“受限”
,是由于为了保证内核稳定性,而不能让用户空间程序随意更改系统,必须是内
核对外开放的且满足权限的程序才能调用相应接口。
在用户空间和内核空间之间,有一个叫做
Syscall(
系统调用
, system call)
的中间层,是连接
用户态和内核态的桥梁。这样即提高了内核的安全型,也便于移植,只需实现同一套接口
即可。
Linux
系统,用户空间通过向内核空间发出
Syscall
,产生软中断,从而让程序陷入
内核态,执行相应的操作。对于每个系统调用都会有一个对应的系统调用号,比很多操作
系统要少很多。
安全性与稳定性:内核驻留在受保护的地址空间,用户空间程序无法直接执行内核代码,
也无法访问内核数据,通过系统调用
性能:
Linux
上下文切换时间很短,以及系统调用处理过程非常精简,内核优化得好,所
以性能上往往比很多其他操作系统执行要好。
二、
Syscall
查找方式
这里以文章理解杀进程的实现原理中的
kill()
方法为例子,来找一找
kill()
方法系统调用的
过程。
Tips 1
:
用户空间的方法
xxx
,对应系统调用层方法则是
sys_xxx
;
TIps 2
:
unistd.h
文件
记录着系统调用中断号的信息。
故
用
户
空间
kill
方
法
则
对
应
系
统
调用
层
便
是
sys_kill
,
这
个
方
法
去
哪
里找
呢
?
从
/kernel/include/uapi/asm-generic/unistd.h
等还有很多
unistd.h
去慢慢查看,查看关键字
sys_kill
,便能看到下面几行:
/* kernel/signal.c */