当前位置: 首页 > 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可以接着下一条指令执行,函数也可以接着执行

http://www.dtcms.com/a/37601.html

相关文章:

  • 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使用教程指南
  • Linux常用命令汇总
  • 电子科技大学考研复习经验分享
  • 微信小程序源码逆向 MacOS
  • [H滑动窗口] lc239. 滑动窗口最大值(模拟+数据结构+单调队列+滑动窗口模板题)
  • 猿大师播放器:交通水利、公安消防Web端Vue网页播放20路RTSP H.265 1080P监控视频流
  • 排序模板——C++
  • 互联网+房产中介+装修设计+物料市场+智能家居一体化平台需求书
  • 【Linux探索学习】第三十一弹——线程互斥与同步(下):深入理解确保线程安全的机制
  • Docker 部署 Graylog 日志管理系统
  • uniapp写的h5跳转小程序