惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
博客园_首页
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
美团技术团队
小众软件
小众软件
V
V2EX
博客园 - Franky
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
Attack and Defense Labs
Attack and Defense Labs
S
Security Affairs
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
T
The Exploit Database - CXSecurity.com
有赞技术团队
有赞技术团队
S
Schneier on Security
人人都是产品经理
人人都是产品经理
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
K
Kaspersky official blog
PCI Perspectives
PCI Perspectives
AI
AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
罗磊的独立博客
O
OpenAI News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The Register - Security
The Register - Security
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
博客园 - 【当耐特】
C
Cisco Blogs
大猫的无限游戏
大猫的无限游戏
Help Net Security
Help Net Security
Google DeepMind News
Google DeepMind News
S
Securelist
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
L
LangChain Blog
SecWiki News
SecWiki News
博客园 - 叶小钗
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V2EX - 技术
V2EX - 技术
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
L
LINUX DO - 热门话题
Cisco Talos Blog
Cisco Talos Blog

博客园 - 叫我安不理

C#如何优雅处理引用类型的深拷贝 老马失前蹄,竟然在数据库外键上翻车了,重温外键级联 字符编码知多少(二) 字符编码知多少(一) 给自己看的mongoDB快速入门 为什么OAuth2与SSO经常混为一谈? 优雅求模,一致性哈希算法 浅谈为什么我讨厌分布式事务 为什么说方法的参数最好不要超过4个? C#代码如何影响CPU缓存速度? 浅谈.NET微服务架构的演变 C#网络编程(六)----Socket编程模型 C#网络编程(五)----细嗦TCP粘包 C#网络编程(四)----HttpClient C#网络编程(三)----HTTP协议 C#网络编程(二)----网络层/链路层 C#网络编程(一)----应用层/传输层 重生之我是操作系统(十)----I/O管理 重生之我是操作系统(九)----文件管理(下) 重生之我是操作系统(八)----文件管理(上)
重生之我是操作系统(七)----内存管理(下)
叫我安不理 · 2025-04-14 · via 博客园 - 叫我安不理

存储隔离

存储隔离,又称为存储保护。确保不同进程、用户空间与内核空间之间的内存互不干扰,防止非法访问或数据破坏。

在操作性系统早期发展的阶段。经常使用两种寄存器来实现隔离。

  1. 上下限寄存器
    在CPU中设置一对上下限寄存器,存放进程的上下限地址,当指令要访问某个地址时,CPU检查是否越界
  2. 重定位寄存器&界地址寄存器
    重定位寄存器存放的是进程的起始物理地址,界地址寄存器存放的是进程的最大逻辑地址。

这些寄存器用于非分页 / 非分段的连续内存分配(如固定分区、动态分区),通过基址 + 限长的方式隔离进程地址空间
它们存在很大的局限性,保护粒度较粗(基于整个程序地址空间,无法细粒度到页或段)。

因此,随着页/段的,线程等现代操作系统概念的普及。基本上已经被淘汰,取而代之的是更加复杂的现代内存管理,也就是上一篇文中讲到的,页/段/段页机制。

  1. 虚拟地址通过 页目录基址寄存器(CR3)+ 页表 逐级映射到物理地址,取代 “重定位寄存器 + 逻辑地址” 的简单加法。
  2. 支持虚拟内存、非连续内存分配,解决早期寄存器的碎片问题。
  3. 页表项包含 访问权限位(如用户态不可读、禁止执行),MMU 在地址转换时自动检查权限,发现越界或非法访问则触发异常(如缺页中断、权限错误)。

x86架构的段描述符仍包含 段基址 和 段界限,可用于实现类似上下限寄存器的功能(如隔离用户空间和内核空间),但分段在现代系统中更多是兼容性设计,核心保护依赖分页。

高效通信

image
在文件读写中,文件的数据是离散存储在硬盘中的。读写文件需要如下几步:

  1. open系统调用,打开文件
  2. seed系统调用,将读写指针移动到某个位置
  3. read系统调用,从读写指针所指位置读取数据
  4. rite系统调用,从读写指针所指位置写入数据

这里的操作就很繁琐,程序员需要自己移动指针,然后读写数据。
按照现在的说法来说,什么都要自己亲历亲为(面向过程),一点都不OOP(面向对象)。

因此,内存映射文件(Memory-Mapped Files)就应运而生。
通过将磁盘文件的内容直接映射到进程的虚拟地址空间,使进程可以像访问内存一样读写文件数据,无需显式执行传统的输入输出(I/O)操作(如read/write)。
image

利用内存映射文件,操作步骤就简化为:

  1. open系统调用,打开文件
  2. mmap建立映射
    操作系统在进程的虚拟地址空间中分配一段区域,并将其与磁盘文件的某个区域(如整个文件或部分片段)建立映射关系
  3. 读写文件
    对映射内存的修改会被操作系统异步或同步地写回磁盘文件,无需用户手动调用write函数
    当进程访问映射区域的内存地址时,若对应的数据尚未加载到物理内存,系统通过缺页中断自动从磁盘文件读取数据并填充到物理内存

内存映射文件实现文件共享

image

这样,多个进程可以映射同一个文件,实现共享。
优点如下:

  1. 高效I/O
    避免传统 I/O 的用户空间与内核空间数据拷贝(如read需先将数据读入内核缓冲区,再复制到用户空间),直接通过内存访问操作文件,大幅提升大文件读写性能。
  2. 内存占用低
    文件内容按需加载(仅访问的部分被读取到内存),节省物理内存占用,方便处理大文件。
  3. 跨进程数据共享
    数据修改会实时反映到所有映射该文件的进程中

在此基础上,还演化出不关联任何磁盘文件,直接分配一段可共享的内存区域,实现进程间的内存共享。
常作为临时数据缓冲区