operating-system - 术语“运行映射/未映射的操作系统”是什么意思?
问题描述
我目前正在学习操作系统课程。
笔记说:
在某些情况下,操作系统只是在未映射的情况下运行。然后它所要做的就是读取表格并在软件中翻译用户地址。但是,在虚拟地址空间中连续的地址在物理上可能不连续。因此,I/O 操作可能必须分成多个块。
假设操作系统也运行映射,那么它必须为用户区生成一个页表条目。请注意,在任何情况下都不应授予用户访问映射表的权限。
我有三个问题:
- 运行未映射的操作系统是什么意思?
- 操作系统运行映射的定义呢?
- 当操作系统未映射运行时,为什么 I/O 操作可能必须拆分为多个块?
解决方案
没有足够的上下文来 100% 确定;但我怀疑:
a)当他们说“操作系统”时,实际上是指“内核”。请注意,操作系统是一个巨大的东西,由许多部分(帮助系统、国际化文件、GUI、各种库、用于管理系统的各种实用程序等)组成,其中几乎所有操作系统(除内核之外的所有内容)都是普通用户-空间的东西。
b)“操作系统只是在未映射的情况下运行”实际上意味着内核在禁用 MMU 的情况下运行(因此内核可以直接访问物理内存,而不涉及“将虚拟地址转换为物理地址”)。对于真正的硬件,这是可怕的(CPU 将“虚拟地址到物理地址”的转换缓存在称为 TLB/转换后备缓冲区的东西中,并且在进入内核时禁用 MMU 并在从内核返回时重新启用它会导致 TLB被刷新,由于“TLB未命中”而破坏性能)。
c)“操作系统也运行映射”实际上意味着内核在启用 MMU 的情况下运行(因此内核必须确保将内容映射到虚拟地址空间才能访问它,因为它不能直接访问物理内存)。请注意,内核可能只是将部分/大部分/全部物理内存映射到所有虚拟地址空间,以便它始终“几乎直接”访问物理内存。
当操作系统未映射运行时,为什么 I/O 操作可能必须拆分为多个块?
如果用户空间使用 MMU(将虚拟地址转换为物理地址)并且“在虚拟内存中连续”并不意味着“在物理内存中连续”;到/来自用户空间(例如read()
,write()
)的 IO 必须被拆分为设备的“物理上连续”的部分。在这种情况下,内核是否映射(或是否使用 MMU)没有区别——用户空间是否使用 MMU 才重要。
如果内核也使用 MMU 并且“在虚拟内存中连续”并不意味着内核空间的“在物理内存中连续”;到/从内核的 IO 也必须拆分为设备的“物理上连续”的部分。
推荐阅读
- c# - 一个 RGB 设置为 255 的随机颜色生成
- c# - 如何从数据库中获取数组中的数据?
- python - 在字符串 python 中查找带有额外字符的名称
- c++ - 如何确定相对于 x 轴像素范围的像素强度?
- sharepoint - 有没有办法在给定节点下的快速启动中添加 NavigationNode 而不是仅使用 Sharepoint Rest API 的子节点?
- javascript - 为什么在这个特定视图中输入的 onclick 事件不触发?
- webpack - Webpack - HMR 插件在 npm run build/dev 上抛出错误
- scala - 播放框架在启动后立即停止
- java - 在连续 8 次测量到的 GC 抖动后关闭 JVM
- java - 在片段中的 AsyncTask 中使用 Jsoup 获取网页元素(Android 新手)