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

Linux开发学习第七天——虚拟内存和物理内存

一、虚拟内存1.概念内核给进程编造的独立地址空间每个进程都以为自己独占内存。它们靠MMU硬件 页表内核做映射。每个进程都独有一份就是之前提到的进程的内存模型。2.作用隔离进程A 进程不能直接访问 B 进程内存。扩大地址空间32 位最多 4G64 位极大。延迟分配 / 写时复制fork、malloc先只建虚拟表不真占物理页。swap 置换把不常用页换到磁盘腾出物理内存。3.映射关系虚拟内存按页Page4KB划分物理内存按页帧Page Frame4KB划分页表保存虚拟页号 → 物理页帧号 权限4.关键机制4.1写时复制fork时只复制页表不复制物理页父子只读共享同一物理页一旦要写 → 触发页异常 → 复制一个新物理页→ 既快又省内存4.2缺页中断访问的虚拟页没有对应物理页内核分配物理页帧建立映射重新执行指令malloc很大内存时真正分配物理内存就是在缺页中断时。4.3Swap交换物理内存紧张时内核把不活跃的匿名页换到磁盘释放物理内存给更需要的进程再次访问时再从 swap 读回会变慢5.相关(联系之前内容)PCB (task_struct) → mm_struct → 页表每个进程有自己的页表所以有独立虚拟空间。fork 复制虚拟空间 共享物理页COWmalloc 先分配虚拟地址真正用的时候才分配物理页栈帧 / RBP都在虚拟地址的 stack 区由内核映射到物理页6.总结虚拟内存进程看到的 “假地址”负责隔离、扩容、延迟分配。物理内存真实内存条按页帧管理。页表 MMU把虚拟地址翻译成物理地址。核心价值进程隔离 高效利用内存 支持多进程并发。二、中断与异常1.定义1.1. 中断Interrupt来自外部硬件的信号网卡、磁盘、键盘、时钟异步发生与 CPU 指令流无关内核处理时处于中断上下文不能睡眠、不能调度必须快速处理 → 分为上半部 下半部1.2. 异常ExceptionCPU 执行指令时发现的错误 / 特殊条件同步发生必须立刻处理分为三类Fault故障可修复修复后重新执行原指令例缺页异常 #PFTrap陷阱指令执行后触发执行下一条例系统调用、断点Abort终止不可恢复系统崩溃例双故障、硬件错误所有中断/异常最终都会进入内核C语言处理函数。2.内核核心数据结构2.1保存所有上下文中断 / 异常发生时硬件 内核汇编代码会把全部 CPU 寄存器保存到内核栈上。这个结构在 C 语言里就是struct pt_regs { unsigned long r15, r14, r13, r12, rbp, rbx; unsigned long r11, r10, r9, r8; unsigned long rax, rcx, rdx, rsi, rdi; unsigned long orig_rax; // 中断向量号 / 系统调用号 // 硬件自动保存 unsigned long rip; // 被打断的指令地址 unsigned long cs; // 代码段 unsigned long eflags; // 标志位 unsigned long rsp; // 被打断时的栈 unsigned long ss; // 栈段 };所有中断 / 异常处理函数的第一个参数都是struct pt_regs *regs2.2. 中断描述符irq_desc内核管理每一个中断的核心结构体struct irq_desc { irq_flow_handler_t handle_irq; // 中断流处理函数 struct irq_chip *chip; // 中断控制器APIC struct irqaction *action; // 驱动注册的处理函数链表 void *handler_data; unsigned int irq; // IRQ号 unsigned int state_use_access; };2.3. 驱动注册的中断处理irqactionstruct irqaction { irq_handler_t handler; // 上半部硬件处理 irq_handler_t thread_fn; // 下半部线程 struct task_struct *thread; // 中断线程 unsigned int flags; void *dev_id; char *name; struct irqaction *next; };3.中断处理完整流程纯 C 语言层第一步硬件发送中断 → CPU外部设备网卡 / 键盘发送电信号中断控制器IO-APIC转发给 CPUCPU暂停当前进程进入内核态第二步硬件 汇编保存上下文一句话CPU 自动将rip, cs, rflags, rsp, ss压栈内核汇编把其余寄存器压栈形成pt_regs然后跳转到 C 语言总入口。第三步C 语言中断总入口do_IRQ()void do_IRQ(struct pt_regs *regs) { // 1. 获取中断向量号 int vector get_vector(regs); // 2. 根据向量号找到中断描述符 struct irq_desc *desc irq_to_desc(vector); // 3. 执行中断处理流程 generic_handle_irq_desc(desc); }第四步执行中断流函数handle_edge_irqvoid handle_edge_irq(struct irq_desc *desc) { // 屏蔽中断 mask_irq(desc); // 发送中断结束应答EOI desc-chip-irq_eoi(desc); // 执行驱动注册的处理函数 handle_irq_event(desc); // 解除屏蔽 unmask_irq(desc); }第五步执行驱动的中断处理函数上半部irqreturn_t handle_irq_event(struct irq_desc *desc) { struct irqaction *action; for_each_action(action, desc) { // 执行驱动的硬中断 handler irqreturn_t ret action-handler(irq, action-dev_id); // 如果需要线程化处理则唤醒线程 if (ret IRQ_WAKE_THREAD) wake_up_process(action-thread); } return IRQ_HANDLED; }第六步中断返回恢复pt_regs回到用户态 / 内核态被中断的代码4.中断的「上半部」与「下半部」内核核心设计4.1. 上半部Hard IRQ运行在中断上下文不能睡眠、不能调度、不能调用可能阻塞的函数只做清除中断标志读取硬件状态启动 DMA触发下半部4.2. 下半部Softirq / Tasklet / Threaded IRQ可以睡眠、调度、使用 mutex、kmalloc处理网络包处理磁盘数据拷贝数据封装、协议解析现代 Linux 推荐线程化中断threaded irq驱动注册方式request_threaded_irq(irq, hard_handler, thread_handler, IRQF_ONESHOT, name, dev);5、异常处理完整流程以缺页异常 #PF 为例异常和中断流程几乎一样只是处理函数不同。第一步CPU 执行指令 → 发现异常例如访问未映射的虚拟地址权限错误除零第二步硬件 汇编保存上下文 → 跳转到 C 函数一句话保存寄存器 → 跳转到异常处理 C 函数。第三步缺页异常 C 语言入口do_page_fault()void do_page_fault(struct pt_regs *regs, unsigned long hw_error) { // 1. 读取触发缺页的虚拟地址 unsigned long addr read_cr2(); // 2. 判断用户态/内核态、读/写、是否缺页 int user user_mode(regs); int write hw_error PF_WRITE; int present hw_error PF_PROT; // 3. 获取当前进程的内存空间 struct mm_struct *mm current-mm; // 4. 查找虚拟内存区域 VMA struct vm_area_struct *vma find_vma(mm, addr); // 5. 处理缺页核心函数 handle_mm_fault(mm, vma, addr, write ? FAULT_FLAG_WRITE : 0); }第四步真正处理缺页handle_mm_fault()vm_fault_t handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned int flags) { // 1. 查找页表 pgd_t *pgd pgd_offset(mm, addr); pud_t *pud pud_offset(pgd, addr); pmd_t *pmd pmd_offset(pud, addr); pte_t *pte pte_offset_map(pmd, addr); // 2. 处理三种情况 // a. 从未分配过物理页 → 分配新页 // b. 页面被交换到swap → 从swap读回 // c. 写时复制COW→ 复制物理页 return do_fault(mm, vma, pgoff, flags, pgd); }第五步返回对于 Fault 类异常#PF重新执行触发异常的指令程序继续正常运行6、中断上下文 vs 进程上下文超级重点1. 进程上下文运行进程代码current指向当前进程可以睡眠、调度、使用 mutex、kmalloc2. 中断上下文运行中断 / 异常处理代码不属于任何进程绝对不能睡眠、不能调度、不能使用可能阻塞的函数只能使用spin_lockkmalloc(GFP_ATOMIC)原子操作判断是否在中断上下文in_interrupt(); // 硬中断/软中断中 → 返回非0 in_irq(); // 硬中断中 → 返回非07、内核中中断 / 异常的关键 APIC 语言1. 驱动注册中断int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);2. 注册线程化中断int request_threaded_irq(unsigned int irq, irq_handler_t hard_fn, irq_handler_t thread_fn, unsigned long flags, const char *name, void *dev);3. 释放中断void free_irq(unsigned int irq, void *dev);4. 全局禁止 / 开启中断local_irq_disable(); // 关中断 local_irq_enable(); // 开中断8、完整总结深入内核必须理解透中断处理流程硬件中断 → CPU 暂停 → 保存寄存器 →do_IRQ()→ 执行中断流 → 驱动 handler → 触发下半部 → 恢复现场 → 返回异常处理流程指令执行错误 → 保存寄存器 →do_*_fault()→ 修复错误如分配物理页 → 恢复现场 → 重新执行指令核心特点中断是异步、外部、分上下半部异常是同步、内部、必须立即修复都保存在 pt_regs中断上下文不能睡眠缺页异常是虚拟内存的基石时钟中断是进程调度的基石三、扩展1.进程切换1.1.进程上下文1进程上文其是指进程由用户态切换到内核态是需要保存用户态时cpu寄存器中的值进程状态以及堆栈上的内容即保存当前进程的进程上下文以便再次执行该进程时能够恢复切换时的状态继续执行。2进程下文其是指切换到内核态后执行的程序即进程运行在内核空间的部分。1.2.中断上下文1中断上文硬件通过中断触发信号导致内核调用中断处理程序进入内核空间。这个过程中硬件的一些变量和参数也要传递给内核内核通过这些参数进行中断处理。中断上文可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境主要是当前被中断的进程环境。2中断下文执行在内核空间的中断服务程序。2.系统调用系统调用就是一种异常——陷入用户态-内核态

相关文章:

Linux开发学习第七天——虚拟内存和物理内存

一、虚拟内存1.概念内核给进程编造的独立地址空间,每个进程都以为自己独占内存。它们靠 MMU(硬件) 页表(内核) 做映射。每个进程都独有一份,就是之前提到的进程的内存模型。2.作用隔离进程:A 进…...

使用Proteus仿真结合RWKV7-1.5B-G1A:模拟智能硬件对话系统

使用Proteus仿真结合RWKV7-1.5B-G1A:模拟智能硬件对话系统 1. 项目概述 在物联网和智能硬件快速发展的今天,如何让硬件设备具备更自然的交互能力成为一个有趣的研究方向。本文将展示一个跨学科创意项目:在Proteus仿真环境中搭建包含MCU和外…...

本科好就业的专业有哪些

本科好就业的专业主要集中在工科和医学领域,尤其以信息技术、智能制造、新能源、医疗健康等国家战略扶持或产业刚需方向的专业为佳。‌‌ 一、工科类专业 工科专业因技术硬核、对接产业紧密,在就业率和薪资上普遍表现突出。‌‌ ‌1、计算机与信息技术类…...

DeepSeek-OCR-2惊艳效果展示:多栏/斜拍/模糊PDF精准识别对比图集

DeepSeek-OCR-2惊艳效果展示:多栏/斜拍/模糊PDF精准识别对比图集 1. 从机械扫描到智能理解:OCR技术的革命性突破 如果你曾经尝试过从PDF文档中提取文字,特别是那些排版复杂、图片模糊或者拍摄角度倾斜的文档,你一定会理解那种挫…...

5分钟打造个性化Windows桌面:RoundedTB任务栏美化终极指南

5分钟打造个性化Windows桌面:RoundedTB任务栏美化终极指南 【免费下载链接】RoundedTB Add margins, rounded corners and segments to your taskbars! 项目地址: https://gitcode.com/gh_mirrors/ro/RoundedTB 厌倦了Windows千篇一律的方块任务栏&#xff1…...

Z-Image-GGUF实战案例:一步步教你画出电影级风景与动漫风格人物

Z-Image-GGUF实战案例:一步步教你画出电影级风景与动漫风格人物 1. 从零到一:你的第一个AI绘画作品 想不想体验一下,只用几句话就让AI为你画出一幅电影海报级别的风景,或者一个充满故事感的动漫角色?今天&#xff0c…...

OpenMP vs C++ 线程池:到底该用谁?

在 C 多线程并行编程中,OpenMP 和线程池是最常用的两种方案。很多开发者都会陷入困惑:同样是实现多线程加速,到底该选 OpenMP 还是 C 线程池?有人觉得 OpenMP 一行代码就能并行,简单高效;也有人偏爱线程池的…...

lumenpnp校准–连接至 LumenPnP 并配置底部相机

总目录:https://www.xlzyw.top/archives/295 既然 OpenPnP 已安装并且 LumenPnP 配置文件已放置在隐藏的系统文件夹中,OpenPnP 可以使用一些基本的预配置设置启动了。下一步是连接您的 LumenPnP 并熟悉 OpenPnP 的用户界面。。 然后,我们将安…...

Python内存管理正在消失?——2026年三大趋势预警:Rust内存安全层集成、WASI沙箱化运行时、实时GC延迟<50μs(仅限首批Early Adopter)

第一章:Python智能体内存管理策略2026最新趋势随着大语言模型驱动的Python智能体(Agent)在生产环境中的深度部署,内存管理已从传统CPython引用计数循环检测机制,演进为面向LLM推理生命周期的多维协同治理范式。2026年主…...

国内开发者福音:手把手教你用微软Authenticator搞定GitHub 2FA验证(附Recovery Codes保存指南)

国内开发者实战指南:微软Authenticator无缝对接GitHub双重验证 GitHub作为全球最大的代码托管平台,近期强制要求所有开发者账户启用双重身份验证(2FA)。对于国内开发者而言,这一安全措施的实施却面临着诸多实际困难——…...

图文翻译神器translategemma-12b-it:Ollama一键部署,支持55种语言

图文翻译神器translategemma-12b-it:Ollama一键部署,支持55种语言 还在为看不懂外文资料、菜单、说明书而烦恼吗?或者,你是否需要快速将一份产品手册、技术文档里的图片内容翻译成中文?今天,我要介绍一个能…...

【记录】LLM|解答家人对AI大模型工具选取的一些疑问

写于2026年3月26日晚上。 作为一个相关研究的研究生,我觉得有必要针对还在读高中的同学(实则是针对亲戚)写一点大模型的使用简明教程。这里并不打算废话太多关于所谓提示词工程或者是AI焦虑类型的内容,只是想从一个长辈的角度尽量…...

Codeforces Round 1082 (Div. 2)2202

Submission #368219050 - Codeforces A. Parkour Design 思路:第一个操作第三个操作两步第二个操作,所以实际上只需要考虑y坐标的变化,然后看一下x的差值是否能整除3就可以了 B. ABAB Construction 思路:奇数长度开头一定是a或者…...

C++ 虚表与多态:从源码到汇编的逐步解析

本文基于代码随想录最强八股文给出的 C 源码与对应的 x86-64(System V ABI 风格)反汇编,按“程序运行流程”一步步解释: 对象内存里 vptr(虚表指针) 在哪构造函数如何 写入 vptrAnimal* 指针如何通过 vtabl…...

基于Matlab的IMU姿态解算之旅:四元数姿态的奇妙融合

基于matlab的IMU姿态解算,姿态类型为四元数;角速度和线加速度的类型为三维向量。 IMU全称是惯性导航系统,主要元件有陀螺仪、加速度计和磁力计。 其中陀螺仪可以得到各个轴的加速度,而加速度计能得到x,y,z方向的加速度…...

《荣耀出征:奇迹MU》安徽游昕官方正版下载:12区开服前瞻 全玩法解析与新手指南

《荣耀出征》奇迹mu手游是安徽游昕运营的手机游戏。由三天手游官网负责游戏攻略、资讯、礼包发放。2026年3月官方授权渠道(官方最新)游戏官方主站为985.yxnds.com,由安徽游昕运营,为游戏官方认证的信息与下载入口,可查…...

C++笔记 缺省值 函数重载 名字空间域(基础核心)

本文为C基础核心知识点笔记,聚焦「缺省值」「函数重载(概念)」「名字空间域」三大高频基础考点,语言通俗、重点突出,兼顾入门理解和考试记忆,适合新手入门、作业复习及GitHub归档。一、缺省值(默…...

OpenClaw配置加密:GLM-4.7-Flash模型凭证的安全存储方案

OpenClaw配置加密:GLM-4.7-Flash模型凭证的安全存储方案 1. 为什么需要保护模型凭证? 上周我在调试OpenClaw对接GLM-4-7-Flash模型时,不小心把包含API Key的配置文件上传到了GitHub。虽然及时发现并撤销,但这个教训让我意识到&a…...

别再只盯着通用数据集了!盘点2024年那些能直接拿来微调LLaMA、ChatGLM的医学问答数据集

2024医学大模型实战:精选可直接微调的问答数据集与应用指南 当开源大模型如LLaMA-3、ChatGLM3和Gemma在通用领域展现出惊人潜力后,医疗健康领域正成为下一个技术落地的黄金赛道。但许多工程师在兴奋地下载完模型权重后,却卡在了最关键的一环—…...

NaViL-9B效果实测:10类常见图片(图表/证件/包装/截图)理解准确率

NaViL-9B效果实测:10类常见图片理解准确率 1. 模型能力概览 NaViL-9B作为原生多模态大语言模型,在图片理解方面展现出令人印象深刻的能力。不同于传统视觉模型,它不仅能识别图片内容,还能结合上下文进行智能推理和描述。 1.1 核…...

D3KeyHelper实战指南:从入门到精通的认知跃迁

D3KeyHelper实战指南:从入门到精通的认知跃迁 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为《暗黑破坏神3》设计…...

3个终极窗口隐藏技巧:如何用Boss-Key打造你的数字隐身衣

3个终极窗口隐藏技巧:如何用Boss-Key打造你的数字隐身衣 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 你有没有经历过这样的…...

FPGA实战避坑:手把手教你用Verilog搞定跨时钟域信号传输(附同步/异步FIFO完整代码)

FPGA实战避坑:手把手教你用Verilog搞定跨时钟域信号传输 第一次在FPGA项目里遇到跨时钟域问题,我盯着屏幕上那些随机跳变的数据波形,整整三天没想明白问题出在哪。当时我正在做一个工业传感器数据采集系统,处理器接口跑在100MHz&a…...

电路原理与情感关系的电子工程解读

电子工程视角下的电路与人生哲学1. 电路元件与情感关系的类比分析1.1 信号放大器与初恋心理初恋阶段的心理状态类似于简单的信号放大器系统。在这个模型中,情感输入信号被高度放大,微小的快乐信号能产生极大的幸福感输出,同样微小的伤害信号也…...

飞书机器人接入OpenClaw:Qwen3.5-4B-Claude模型对话触发方案

飞书机器人接入OpenClaw:Qwen3.5-4B-Claude模型对话触发方案 1. 为什么选择飞书OpenClaw的技术问答方案 去年团队内部开始频繁出现一个现象:每当新人遇到技术问题,总会在飞书群里反复老员工。简单的环境配置问题往往需要截图、录屏、文字描…...

Linux驱动工程师面试技术要点与开发实践

Linux驱动工程师面试技术要点解析 1. 面试技术问题深度剖析 1.1 基础驱动开发能力考察 面试中关于驱动开发的基础问题主要考察候选人对底层通信协议的理解程度。I2C总线作为嵌入式系统中最常用的通信接口之一,其起始信号(START Condition)的…...

03-LlamaIndex节点解析:文本分块策略与NodeParser深度应用

03-LlamaIndex节点解析:文本分块策略与NodeParser深度应用 系列导航 01 核心概念与RAG处理管线02 多源数据加载与Data Connectors03 文本分块策略与NodeParser ← 当前04 向量存储与混合索引策略05 Retriever、Query Engine与Chat Engine06 Agent与Workflow编排07 多…...

终极桌面伴侣BongoCat:让键盘鼠标操作变得生动有趣的虚拟猫咪

终极桌面伴侣BongoCat:让键盘鼠标操作变得生动有趣的虚拟猫咪 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作,每一次输入都充满趣味与活力! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat …...

3步解锁Yuedu书源:终结小说断更烦恼,实现阅读自由

3步解锁Yuedu书源:终结小说断更烦恼,实现阅读自由 【免费下载链接】Yuedu 📚「阅读」APP 精品书源(网络小说) 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 你是否经历过这样的时刻:熬夜追更…...

Pitest深度解析:Java突变测试系统的架构设计与实战应用

Pitest深度解析:Java突变测试系统的架构设计与实战应用 【免费下载链接】pitest State of the art mutation testing system for the JVM 项目地址: https://gitcode.com/gh_mirrors/pi/pitest 在当今快速迭代的软件开发环境中,传统的代码覆盖率指…...