今天,几乎所有内核都使用MMU提供的虚拟内存。它们使用全局页表(其地址位于CPU寄存器中)和页监控器/页映射程序来实现这一点。例如,vmlinuz中的"vm“意味着linux内核支持虚拟内存。
这一切都是可能的,因为MMU将连续的内存地址映射到x86体系结构所理解的内存段。
最初的UNIX内核确实有一个vmunix版本,我相信它一定使用了类似的技术。然而,最初的UNIX内核是在MMU可用之前编写的。如果我没有弄错的话,最初的UNIX内核(简称unix)是在x86体系结构存在之前编写的。从历史上看,它确实运行在PDP-9和PDP-11上。
内核是如何执行内存寻址和管理的?是基于段的寻址(两个数字)还是全内存寻址(一个数字)?它是如何在处理之间分离内存的?
发布于 2016-12-25 19:25:55
您不需要分页MMU来获得内存保护。
分页MMU解决了许多更高级的问题,如内存碎片(大块不可用)和mmap (仅保留内存中最近使用的文件部分)。分页MMU是实现“统一页面缓存”以缓存跨所有进程的文件访问所必需的。
但是,简单的“分段”就可以完成基本的内存保护,这可能对早期的Unix实现是可用的。例如,在执行用户模式代码时,可以将受保护的内核内存放置在一个设置为“无访问”的段中。即使在现代分页操作系统Linux上,系统调用brk()和sbrk()也是在分段实现的日子里作为兼容性保持存在的。
本质上,分段有点像一个分页的MMU,除了你只得到一个固定数量的可变大小的“页面”(实际上称为段),而不是一个可变数量的固定大小的页面。
即使在今天,分割仍然存在于低成本的微控制器中,这些微控制器可能只有几千字节的SRAM,这使得实现一个带有保护内存的小操作系统成为可能,尽管没有真正的分页MMU。
https://unix.stackexchange.com/questions/332699
复制相似问题