跳至主要內容

I/O:系统调用

mozzie大约 2 分钟JavaJava

I/O:系统调用

内核态

用户空间:用户代码、用户堆栈

内核空间:内核代码、内核调度程序、进程描述符(内核堆栈、thread_info 进程描述符)

  • 进程描述符和用户的进程是一一对应的
  • SYS_API 系统调用:如 read、write,系统调用就是 0X80 中断
  • 进程描述符 pd:进程从用户态切换到内核态时,需要保存用户态时的上下文信息在 PCB 中
  • 线程上下文:用户程序基地址,程序计数器、cpu cache、寄存器等,方便程序切回用户态时恢复现场
  • 内核堆栈:**系统调用函数也是要创建变量的,**这些变量在内核堆栈上分配

80中断

在用户程序中调用操作系统提供的核心态级别的子功能,为了系统安全需要进行用户态和内核态转换,状态的转换需要进行 CPU 中断,中断分为硬中断和软中断:

  • 硬中断:如网络传输中,数据到达网卡后,网卡经过一系列操作后发起硬件中断

  • 软中断:如程序运行过程中本身产生的一些中断

  • 发起 0X80 中断

  • 程序执行碰到除 0 异常

系统调用 system_call 函数所对应的中断指令编号是 0X80(十进制是 8×16=128),而该指令编号对应的就是系统调用程序的入口,所以称系统调用为 80 中断

系统调用的流程:

  • 在 CPU 寄存器里存一个系统调用号,表示哪个系统函数,比如 read
  • 将 CPU 的临时数据都保存到 thread_info 中
  • 执行 80 中断处理程序,找到刚刚存的系统调用号(read),先检查缓存中有没有对应的数据,没有就去磁盘中加载到内核缓冲区,然后从内核缓冲区拷贝到用户空间
  • 最后恢复到用户态,通过 thread_info 恢复现场,用户态继续执行

参考视频:https://www.bilibili.com/video/BV19D4y1o797

贡献者: mozzie