【OS内核】系统调用

概念

除异常和陷入,内核唯一的合法入口,应用程序和内核态的通信使者

应用编程接口API 和 系统调用

用户空间实现API,可以实现1个,多个系统调用,也可以不调用
Unix --> 流行API是基于POSIX标准,根据POSIX定义的API和系统调用之间有着直接关系
内核提供的功能是固定的,但是不同系统,实现的具体策略可能不一样

  • 系统调用举例
    asmlinkage long sys_getpid(void)

    asmlinkage 仅从栈中提取该函数的参数。是一个编译指令,所有系统调用都需要这个限定词。
    long 返回long类型
    getpid()遵守命名规则,变为sys_getpid()

系统调用号

每个系统调用 --> 独一无二的系统调用号
一旦分配不能有任何变更,系统调用删除后,号也不能回收。考虑已经编译过的程序,不能产生错误
专门有一个“未实现”系统调用 sys_ni_syscall() 返回-ENOSYS,针对无效系统调用而设

通知内核

用户的程序无法直接调用内核函数,要保证系统的安全、稳定
应用程序应该通知内核,需要执行一个系统调用,希望系统切换到内核态。
软中断实现

  • 软中断
    引发一个异常来促使系统切换到内核态执行异常处理程序。
    此时,异常处理程序 = 系统调用处理程序
    x86软中断号 --> 128
    int $0x80指令触发该中断,触发异常,导致系统切换到内核态并执行128号异常处理程序,system_call()

  • 指定系统调用
    x86 --> 通过wax寄存器传递给内核。
    陷入内核前,用户把系统调用号放入eax。
    system_call()判断是否超出范围,无效返回-ENOSYS。有效执行:
    call *sys_call_table(, %rax, 8)

  • 传参
    x86-32系统,ebx、ecx、edx、esi、edi顺序存放前5个参数
    多余5个的,用一个单独的寄存器存放指针,指向这些参数的用户空间地址
    给用户返回的值也通过寄存器传递。x86上,存放在eax寄存器中。

系统调用实现

明确调用用途,不提倡多用途调用
参数尽量少
考虑新功能加入,提供了标志参数以确保向前兼容
要时刻考虑可移植性和健壮性

  • 参数验证
    检查用户提供的指针是否有效
    内核需保证:
    1、指针指向的内存区域属于用户空间
    2、内存区域在进程的地址空间里
    3、对应内存的读写权限标记,不能绕过内存访问限制

内核提供两个方法完成检查、内核与用户之间的数据拷贝

  • copy_to_user() *向用户空间写入数据
    参数一:进程空间中的目的内存地址
    参数二:内核空间内的源地址
    参数三:需要拷贝的数据长度

  • copy_from_user() *从用户空间读取数据
    ad1, ad2, len
    把ad2位置上的数据,拷贝到ad1位置

系统调用上下文

执行系统调用时,处于进程上下文。current指针指向当前任务,引发系统调用的那个进程。
进程上下文中:

  • 内核可以休眠
  • 可以被抢占

能够休眠,说明系统调用可以使用内核提供的绝大部分功能。
能够抢占,说明可以被其他进程抢占,要保证共同的系统调用是可重入的。

绑定一个系统调用

  1. 在系统调用表的最后加入一个表项,系统调用在该表的位置就是系统调用号
  2. 对于所支持的体系结构,调用号都必须定义于<asm/unistd.h>
  3. 系统调用必须被编译进内核映像

每隔5个表项就加入一个调用号注释,方便查找

从用户空间访问系统调用

系统调用靠C库支持,用户程序通过包含标准头文件并和C库链接
调用库函数,再由库函数实际调用

系统调用小结

陷入内核,传递系统调用号和参数,执行系统调用,返回给用户结果
新建系统调用的好处:

  • 容易,方便使用
  • 系统调用性能高

但是:

  • 需要一个系统调用号,内核处于版本开发时,官方分配
  • 加入稳定内核后,系统调用已经固化,不允许改动接口
  • 分别注册到每个体系结构中
  • 脚本中不易调用
  • 需要调用号,在主内核树外很难维护
posted @   一个斯帕纳  阅读(111)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示