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

(done) ABI 相关知识补充:内核线程切换、用户线程切换、用户内核切换需要保存哪些寄存器?

由于操作系统和编译器约定了 ABI,如下:
在这里插入图片描述

编译器在对 C 语言编译时,会自动 caller 标注的寄存器进行保存恢复。保存的步骤通常发生在进入函数的时候,恢复的步骤通常发生在从函数返回的时候。

内核线程切换需要保存的寄存器:通常仅保存 callee 标注的寄存器。原因:内核线程切换使用 swtch 函数。是在一个内核层的函数中间跳转到另一个内核层的函数中间。也就是说,程序不需要为 caller 标注的寄存器负责,因为调用 swtch 的函数已经把 caller 标注的寄存器保存好了(只要编译器是遵循上述 ABI 规范的)。

用户线程切换需要保存的寄存器:通常仅保存 caller 标注的寄存器。原因:用户线程切换通常是由于 sigalarm 进行切换。这个过程是从一个用户层函数的中间跳转到另一个用户层函数(handler)的开头。在跳转到另一个用户层函数的开头时,callee 标注的寄存器会被保存,并在从 handler 返回时恢复 callee 标注的寄存器。所以仅需保存 caller 标注的寄存器。

用户态和内核态之间的切换:caller 和 callee 都需要保存。原因:从用户层函数的中间跳转到内核层函数的中间,这期间没有经过任何“进入函数”和“从函数返回”,因此不会有任何寄存器被编译器生成的汇编自动保存。


http://www.kler.cn/a/524268.html

相关文章:

  • 大数据相关职位介绍之二(数据治理,数据库管理员, 数据资产管理师,数据质量专员)
  • 基于dlib/face recognition人脸识别推拉流实现
  • 算法12(力扣739)-每日温度
  • Vue 3 + TypeScript 实现父子组件协同工作案例解析
  • DeepSeek--通向通用人工智能的深度探索者
  • 解读隐私保护工具 Fluidkey:如何畅游链上世界而不暴露地址?
  • MATLAB中extractAfter函数用法
  • Git进阶之旅:Git 命令
  • Django ORM解决Oracle表多主键的问题
  • 全程Kali linux---CTFshow misc入门(1-12)
  • CMake常用命令指南(CMakeList.txt)
  • Vue 3 30天精进之旅:Day 07 - Vue Router
  • 【Python百日进阶-Web开发-FastAPI】Day812 - FastAPI Cookie 参数、Header 参数
  • 运用python爬虫爬取汽车网站图片并下载,几个汽车网站的示例参考
  • 一个python项目中的文件和目录的作用是什么?scripts,venv,predict的具体含义
  • GO 高级特性篇
  • 常见端口的攻击思路
  • 爱书爱考平台说明
  • C#操作GIF图片(上)
  • python+playwright自动化测试(八):iframe切换、多窗口切换
  • Go Fx 框架使用指南:深入理解 Provide 和 Invoke 的区别
  • 单片机基础模块学习——AT24C02芯片
  • open-webui本地AI人工智能问答知识库搭建
  • 云计算与虚拟化技术讲解视频分享
  • 【赵渝强老师】K8s中Pod探针的ExecAction
  • Java基础知识总结(二十四)--Collections