当前位置: 首页 > news >正文

系统调用过程

注意:本系统调用过程基于32位操作系统

中断服务程序的寻址过程

在这里插入图片描述
1.用户态程序产生系统调用write();
2.产生中断指令ENTER_KERNEL(int $0x80=128),CPU收到中断指令去查询中断向量表,找出中断号0x80对应的中断服务程序的内存基地址(0x003498)
3.程序计数器PC设置为0x003498,CPU就会执行对应的中断服务程序(entry_INT80_32)

系统调用用户态发生的事情

在这里插入图片描述

1.用户态程序产生系统调用write()

2.保存函数参数到CPU寄存器(ebx、ecx、edx....)

3.通过方法名write()查看用户态下的文件找到对应的系统调用号(3),并将系统调用号存储到CPU的EAX寄存器中

4.通过中断指令ENTER_KERNEL进入到内核(见中断服务程序的寻址过程)

系统调用内核态发生的事情

在这里插入图片描述
经过上面系统调用用户态发生的事情这一节我们知道,当前CPU通过EAX寄存器保存了系统调用号,其它寄存器保存了函数参数
1.将用户态寄存器保存到内核pt_regs缓存中(也就是当前CPU寄存器的值)

2.在系统调用表中(sys_call_table),根据EAX寄存器传到内核态的值,找到内核对应的系统调用函数(sys_write)

3.执行系统函数(函数参数已经通过寄存器传到了内核态)

4.函数执行完毕,返回值写入CPU的Eax寄存器,通过指令iret根据pt_regs缓存恢复用户态程序

整体流程

在这里插入图片描述
注意:切换到内核态时,还会在pt_regs缓存中缓存栈指针,程序计数器PC,方便内核态切换回用户态时,恢复系统调用前的上下文信息,CPU可以接着下一条指令执行,函数也可以接着执行

相关文章:

  • nv docker image 下载与使用命令备忘
  • MySQL-增删改查
  • Selenium 与 Coze 集成
  • java.2.25
  • Linux中的cgdb的基本使用
  • 剑指offer - 面试题11 旋转数组的最小数字
  • 华为机试牛客刷题之HJ76 尼科彻斯定理
  • Docker 搭建 Gitlab 服务器 (完整详细版)
  • VScode 开发
  • [算法--前缀和] 和可以被K整除的子数组
  • 软考高级【网络规划设计师】 综合知识
  • 使用Python开发PDF文本提取工具
  • 安装vm和centOS
  • Java进阶学习笔记23——API概述
  • Docker打包Python项目
  • Vue 中动态实现进度条
  • PV Elite 27是专业的压力容器和热交换器设计解决方案
  • 数据分析——Pandas 中的 apply() 函数
  • MySQL 中的事务隔离级别有哪些?MySQL 默认的事务隔离级别是什么?为什么选择这个级别?数据库的脏读、不可重复读和幻读分别是什么?
  • 【System Verilog and UVM基础入门26】Verdi使用教程指南
  • 太原专业制作网站/推广计划
  • 那个网站专门做婚纱相册/semseo
  • 宜昌网站建设厂家/网络营销师是做什么的
  • 上城网站建设/自己如何开网站
  • 黔西南北京网站建设/百度秒收录软件工具
  • 制作网站基本步骤/关键词挖掘爱站网