当前位置: 首页 > 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.mrgr.cn/news/92337.html

相关文章:

  • 模型蒸馏与量化技术:让AI模型“瘦身”却不“降智”的底层逻辑
  • 可狱可囚的爬虫系列课程 14:10 秒钟编写一个 requests 爬虫
  • Android AOSP系统裁记录
  • 在 HuggingFace 中使用 SSH 进行下载数据集和模型
  • Java入门基础、JDK安装和配置
  • 音视频入门基础:RTP专题(12)——RTP中的NAL Unit Type简介
  • mamba,mamba2环境搭建
  • Python批量压缩并上载CSV数据文件到Box企业云盘
  • kvaser pythoncan 调用报错(x86 ubuntu工控机)
  • Metal 学习笔记四:顶点函数
  • Python学习第十七天之PyTorch保姆级安装
  • TCPDF 任意文件读取漏洞:隐藏在 PDF 生成背后的危险
  • (0)阿里云大模型ACP-考试回忆
  • day7作业
  • kubernetes-完美下载
  • 2025-02-25 学习记录--C/C++-用C语言实现删除字符串中的子串
  • Redis存储​⑫​哨兵Sentinel_高可用实现方案
  • 智慧交通之信号控制【绿波带】
  • 大厂都在用的前端换肤方案:多品牌适配 + 夜间模式全解析
  • java.lang.IllegalStateException: dbType not support : null, url null