进程和硬件设备间添加的中间层;受限(保护设备的安全性)的访问硬件设备;合法手段,其他可通过异常或陷入;POSIX是最流行的基于Unix的可移植的系统标准;C库函数以及系统调用接口;
函数定义来进行;errno中,用户可通过perror打印错误字符串查看;如何定义一个系统调用
asmlinkage,是一个编译指令,通过编译器仅从栈中提取该函数的参数;long是为了兼容32位和64位;系统调用号
唯一的一个号码,指明执行的哪个系统调用,在进程中使用;不能被删除,由于不能被回收,会通过sys_ni_syscall回收;sys_call_table中;系统调用的性能
相比与其他系统速度要快;
上下文件切换速度快,函数处理本身简洁;
软中断通知系统,告知内核需要执行一个系统调用,希望系统切到内核态,故内核可代表程序在内核空间执行系统调用;软中断
异常来让系统切换到内核态去执行程序;128(int $0x80)来触发,程序名为system_call;sysenter指令,速度更快;指定恰当的系统调用
在系统调用陷入内核中,必须把系统调用号传给内核,x86上在陷入内核前,用户空间将相应的调用号存储在eax中,当调用处理程序是,内核即可在eax中获取;
system_call
NR_syscalls将给定的系统调用号检查有效性,错误返回-ENOSYS;64位类型存放,故需要将给定的系统调用号乘4,在去查询位置;参数传递
ebx、ecx、edx、esi、edi按顺序存放函数中前5个参数;单独的寄存器存放指向所有该参数在用户空间地址的指针;返回值通过eax寄存器存放;简洁且参数少,且要稳定;标志来增加新的功能和选项,不会破环系统的兼容性;通用性要强;参数验证
合法性,保证内核的安全和稳定;用户空间,进程不可使用它去读取内核的数据;进程的地址空间,进程不能为去获取其他进程的数据;权限需要一致,不能修改该指针的权限;内核提供两种方法在用户和内核间进行数据拷贝
阻塞(用户数据的页被换出到硬盘时),此时进程会休眠,直到程序从硬盘换到物理内存;超级权限
capable()来检查是否对指定的资源进行操作;进程上下文;休眠或抢占,故需要保证系统调用为可重入;system_call中,它会负责切换到用户空间,并执行剩下的;绑定一个系统的调用的最后步骤
注册成一个正式的系统调用;、
表项添加,从0开始;asm/unistd.h中;从用户空间访问系统调用
syscalln(),用于直接对系统调用进行访问,会设置好寄存器并调用陷入指令;0~6,代表参数个数,对于该宏,会被拓展为2+2*n个参数;long open(const char *filename, int flags, int mode)
===>
#define NR_open 5
_syscall3(long, open, const char *, filename, int, flags, int, mode);
//返回值类型, 调用名,参数类型,参数名....
优点
方便;性能高;缺点
官方分配;固化,不允许改动;不容易调用系统调用,且不能从文件系统直接访问系统调用;