OS第二章随手记(2.1)
目录一、进程阻塞的过程二、阻塞队列三、对时钟中断与中断的思考四、虚拟地址的思考五、保存程序状态六、int 0x80 的思考七、中断源八、陷入机制九、MMU的简略描述十、王道题目知识点总结一、进程阻塞的过程进程调用了一个系统调用函数去访问资源CPU去执行系统调用的代码也就是内核代码内核代码里写了 if (资源不可用) { 阻塞当前进程执行阻塞原语; } 这个逻辑系统调用间接触发了内核中的阻塞原语。CPU 执行内核代码→ 内核代码里调用阻塞原语 → 把当前进程链入等待队列也就是说进程本身的代码不会管资源能不能用而是自己只调用了一个系统调用去访问资源至于资源是否可用、状态的切换都是由CPU执行操作系统的代码来完成的但这种行为算是进程主动的阻塞自己进程主动阻塞→ 强调的是触发点是进程自己发起的系统调用操作系统把进程阻塞→ 强调的是实际动作是内核执行的二、阻塞队列CPU是没有自己的阻塞队列的书上说的CPU阻塞队列其实都是那些阻塞事件的阻塞队列进程从事件的阻塞队列到CPU的就绪队列上后等待CPU的调度有了资源后CPU使用资源CPU执行代码去使用资源进程使用资源的过程也是代码也要CPU来执行资源准备好了CPU不会自动使用资源准备好了只是“可以继续用”不是“已经用了”其实就CPU回到没执行完的地方继续执行当然去使用资源的代码是程序员写的具体使用资源的底层是OS的代码的资源就绪后进程并不会自动使用资源CPU 调度该进程后会从上次阻塞的位置继续执行进程代码由这些代码程序员写的或 OS 提供的真正去访问和使用资源。三、时钟中断调度返回与中断响应遇到的问题问题来源书上说“假设进程1在执行的过程中收到一个时钟中断中断响应后CPU 从用户态切换到内核态中断处理程序接管 CPU。若进程 1的时间片到了需要调度则会调用调度程序从就绪队列中选中一个进程 2随后将当前的运行上下文保存到进程1的 PCB 中根据进程2的 PCB 恢复其上下文。随后通过中断返回到进程2”。在中断响应中CPU会保存断点和程状态将程序的返回地址和PSW送到栈或CPU特定寄存器中保存。这里的放回地址应该是进程1的地址进程1的返回地址被保存到了内核栈中对吧那为什么书是上说“随后通过中断返回到进程2”。保存的断点不应该是进程1的吗怎么回到进程2了所有的中断响应过程都会有关中断、保存断点和程序状态、识别异常和中断并转到相应的处理程序。在中断响应过程中保存进程1的断点返回地址和程序状态字PSW送到进程1的内核栈或特定的寄存器中每个进程创建时OS 会分配两样东西分配项说明PCB存进程所有管理信息 硬件上下文内核栈进程陷入内核时用跟进程同生共死内核栈不是临时的它跟 PCB 绑定在一起生命周期完全一致进程创建 → 分配内核栈 PCB → 进程运行/睡眠/被换出 → 进程销毁 → 内核栈才释放(这里的PC理解为要继续执行的指令地址也就是返回地址一般是当前PC的值或PC“1”的值我的简单理解在中断响应时CPU把进程1的PC和PSW压入进程1的内核栈然后执行中断处理程序如果是时钟中断且进程1的时间片用完了或者放弃CPU等等那么CPU就会执行调度程序此时会将CPU中寄存器的状态都保存在进程1的PCB中其中包括了esp(栈指针操作系统再把进程1内核栈中保存的PC值和PSW也保存在进程1的PCB中。然后把进程2的PCB中的寄存器的值恢复到CPU寄存器上其中就包括esp寄存器的值所以CPU的栈指针自然就指向了进程2的栈空间。中断返回主要就是弹出当前栈指针指向的栈空间中的值PC、PSW所以最终CPU处理完中断服务程序执行中断返回时就自然而然的“返回到进程2中”进程的内核栈始终会保存着这个进程的返回地址和PSW哦。四、虚拟地址的思考看这 : 虚拟地址空间就是方便你写代码的地址描述图假的这不就虚拟地址前面是地址后面是指令为什么有虚拟地址在一个程序编译好后例如进程A的代码段会存在一些指令mov eax, [850] 从起始地址为850处取出数据执行还有 JMP 等指令这些指令涉及到了指令和数据的地址。可见在形成可执行文件时就已经给出了每个指令和数据的地址。那么好进程在内存中调入时换进换出时那个指令所在的位置可能已经变了比如变成了400真实地址是400但在指令中写的是850 那么CPU去执行这个代码时就会找不到正确的地址。在中断响应中不是有一些其他的硬件来执行这一系列操作而是CPU自动执行的在它内部电路中设计好了只要发生中断CPU就自动去执行这个流程也就是中断响应那在中断响应中PC要指向中断服务程序的地址入口请问CPU都不知道内核代码的具体位置它怎么跳转到 那里去最好的结果不就是拿到进程中的保存的内核虚拟地址在执行时再转换到真实地址上去我们不关心应用程序或内核程序的代码的物理地址具体在哪我们只需要使用虚拟地址即可。在执行时通过页表找到真实的物理地址这步骤我们并不关心程序员/编译器/链接器只和虚拟地址打交道写代码、编译、链接时用的全是虚拟地址只有在CPU去找这个地址时才会涉及到真实的物理地址五、保存程序状态在中断响应中保存程序状态可以理解为就是保存PSW。六、int 0x80 的思考执行陷入指令int 0x80这里的int就是x86的软中断的指令执行它主动产生一个中断而0x80 表示中断号/中断向量号CPU知道了中断号知道了中断源就去中断向量表 找到中断向量中断服务程序的入口地址从而找到该中断源的中断服务程序 int 0x80 是系统调用的入口中断服务程序会进一步根据EAX不就eax寄存器吗大写我还以为是什么呢 中的系统调用号分发到具体的系统调用处理函数。七、中断源中断源就是能够引发中断的事件/设备常见分类硬盘是一个中断源 ✅硬盘完成读写后磁盘控制器会向 CPU 发一个硬件中断信号如 IRQ 14/15通知我干完了。系统调用也是一个中断源 ✅通过 int 0x80 或 syscall 指令主动触发软中断/陷入让 CPU 陷入内核态。每个中断源或者说每个中断向量都有对应的中断服务程序ISR硬盘的 IRQ → 对应硬盘驱动中的中断处理程序处理数据传输完成、错误处理等int 0x80 → 对应系统调用统一入口处理程序如 system_call再根据具体系统调用号分发不过要注意一个细节多个外部设备可能共享同一个 IRQ 线这时一个中断向量可能对应多个 ISR内核会依次调用。但逻辑上每个中断源都有自己专属的处理程序这是驱动开发的基本模型。总结一句话中断响应时硬件自动保存断点PC和程序状态PSW/FLAGS软件再保存其余现场int 0x80触发一个软中断让 CPU 从用户态陷入内核态跳转到系统调用统一入口处理程序用中断号索引中断向量表找到服务程序系统调用和硬盘都是中断源各自有对应的中断处理程序。所以每个中断源都有自己的一些中断处理程序。八、陷入机制所以“陷入”也只是一个机制int 就能产生中断系统调用也只是利用这个机制而已在 int 0x80 之前系统调用是要通过寄存器传参write(1, hello, 5);汇编代码mov eax, 4 ; sys_write mov ebx, 1 ; fd stdout mov ecx, msg ; buffer mov edx, 5 ; length int 0x801、用 eax 表示“要调用哪个系统调用”eax 系统调用号例如2、用其他寄存器传参数流程就是CPU 把eax/ebx/ecx/edx ..... 设置参数执行到int 0x80 陷入内核态跳转到系统调用服务程序的地址从eax 取出系统调用号查系统调用表 sys_call_tablr[eax] ,在去执行具体的系统调用函数九、MMU的简略描述十、王道题目知识点总结进程映像也就是进程实体就像是给进程在运行过程中拍了一张照片。主要包括三个部分程序段、相关数据段、PCB。程序是一个静态的概念由代码和数据组成进程是一个动态的概念由程序、和该程序的运行上下文组成PS进程时一个程序在运行时OS方便管理这个程序的执行而提出的概念它的堆、栈、通用寄存器的值、PC的值... ,都是记录在这个进程映像/实体随着程序的执行里面的值是不断在变化的所以与程序相比当然也只能和程序比最重要的特性就是动态。一个进程就是一个正在运行的程序由这个程序和在计算机中涉及到这个程序的所有状态信息组成无非就是在内存和CPU中的状态也就是运行上下文以及一些系统资源进程的生命周期是断断续续的并发的进程具有间断运行的特点进程具有失去封闭性进程的执行结果与速度有关使得进程的执行具有不可再现性会相互影响体现在速度不同共享变量而导致执行结果与速度有关优先级分为静态和动态动态优先级是随运行情况而随时调整的单处理器系统发生死锁时有可能进程全部都处于阻塞态并发进程执行的相对速度不是只由优先级有关最主要的还是与调度策略有关一个进程在其生命周期中可执行多个程序没弄懂正文段数据段代码段涉及用户级线程切换的事件不会设计操作系统导致创建新进程的事件 操作系统启动用户发出请求创建一个新进程(也就是用户与OS的交互会创建新..CPU执行一个进程代码执行到了创建新进程的系统调用

相关新闻

写屏障机制原理

写屏障机制原理

写屏障机制原理 1. 核心概念与工作原理 并发 GC 最大的难题不是"如何快",而是"如何对"。当 GC 扫描与用户 goroutine 同时运行时,用户 goroutine 改写指针的瞬间可能让 GC 漏标存活对象。这就需要一种机制——每当用户程序执行指针赋…

2026/9/25 16:54:19 阅读更多 →
KytyPS5跨平台实战指南:Windows、Linux与macOS上运行PS5模拟器的终极配置清单

KytyPS5跨平台实战指南:Windows、Linux与macOS上运行PS5模拟器的终极配置清单

KytyPS5跨平台实战指南:Windows、Linux与macOS上运行PS5模拟器的终极配置清单 【免费下载链接】KytyPS5 PlayStation 5 emulator for Windows, Linux and MacOS 项目地址: https://gitcode.com/gh_mirrors/ky/KytyPS5 KytyPS5 是一款免费开源的 PS5 模拟器&a…

2026/9/25 16:54:19 阅读更多 →
恶意加密流量监测平台实战:从TLS 1.3特征工程到LightGBM与一维CNN模型部署

恶意加密流量监测平台实战:从TLS 1.3特征工程到LightGBM与一维CNN模型部署

简介:这份资源是面向网络安全与人工智能方向学习者、安全开发者的实战项目包,聚焦利用机器学习识别恶意加密流量这一核心难题。内容围绕数据预处理、特征工程、模型选择与评估展开,涉及SVM、随机森林、神经网络等算法,并讨论TLS指…

2026/9/25 16:54:19 阅读更多 →

最新新闻

lego v4 到 v5 库迁移完全指南:Context 化、slog 日志与 API 重构要点

lego v4 到 v5 库迁移完全指南:Context 化、slog 日志与 API 重构要点

网络安全密码学 【免费下载链接】lego Lets Encrypt/ACME client and library written in Go 项目地址: https://gitcode.com/gh_mirrors/le/lego 点击查看 免费下载 本文基于 go-acme/lego 官方迁移文档(docs/content/migration/library.md&#xff09…

2026/9/25 17:36:47 阅读更多 →
如何为开源项目 npmx.dev 贡献代码:环境搭建、开发工作流与测试体系指南

如何为开源项目 npmx.dev 贡献代码:环境搭建、开发工作流与测试体系指南

如何为开源项目 npmx.dev 贡献代码:环境搭建、开发工作流与测试体系指南 【免费下载链接】npmx.dev a fast, modern browser for the npm registry 项目地址: https://gitcode.com/gh_mirrors/np/npmx.dev npmx.dev 是一个快速、现代的 npm 注册表浏览器&…

2026/9/25 17:36:47 阅读更多 →
opencodex 配额用量 UI 重构:PR139 中 QuotaBars 行模型、窗口排序与重置文案的实现解析

opencodex 配额用量 UI 重构:PR139 中 QuotaBars 行模型、窗口排序与重置文案的实现解析

【免费下载链接】opencodex Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code 项目地址: https://gitcode.com/gh_mirrors/ope/opencodex 点击…

2026/9/25 17:36:47 阅读更多 →
WorkBuddy Enterprise 企业级 AI 平台与 Agent 生态落地实践指南

WorkBuddy Enterprise 企业级 AI 平台与 Agent 生态落地实践指南

1. 从零理解 WorkBuddy Enterprise 的定位与核心价值1.1 它到底是什么,解决谁的什么问题WorkBuddy Enterprise 是腾讯云推出的一套企业级 AI 平台与 Agent 生态产品。说人话就是:它把大模型能力、Agent 编排、企业知识库、工具调用、权限管控这些东西打包…

2026/9/25 17:36:47 阅读更多 →
用treg做Lead富化的完整流程:从搜索工具到批量验证实战

用treg做Lead富化的完整流程:从搜索工具到批量验证实战

用treg做Lead富化的完整流程:从搜索工具到批量验证实战 【免费下载链接】treg OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn 项目地址: https://gitcode.com/GitHub_Trending/treg/treg treg 是一个开源的 Agent 工具注…

2026/9/25 17:36:47 阅读更多 →
深度解析 Anthropic Skills:用 SKILL.md 为 Claude Code 定制技能扩展

深度解析 Anthropic Skills:用 SKILL.md 为 Claude Code 定制技能扩展

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 17:35:46 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →