【问题标题】:memory used by operating system操作系统使用的内存
【发布时间】:2018-11-14 09:23:16
【问题描述】:

我认为我错过了操作系统如何管理内存的基本概念。

  • 操作系统负责跟踪物理内存的哪些部分是空闲的。
  • 操作系统创建和管理页表,页表具有虚拟地址到物理地址之间的映射。
  • 对于每条指定虚拟地址的指令,硬件都会读取页表以获取对应的物理地址。硬件可能知道当前页表位置的一种方法是通过操作系统更新的寄存器。

这对于进程如何访问内存是有意义的。但是,我不明白操作系统本身是如何访问内存的。

假设它使用相同的指令,硬件仍会从虚拟地址转换为物理地址吗?例如,操作系统本身的页表是否存在已知的物理位置?我知道这个问题很模糊,甚至无法理解要问什么。

【问题讨论】:

  • “假设它使用相同的指令,硬件仍然会从虚拟地址转换为物理地址吗?”是的。 “例如,操作系统本身的页表是否存在已知的物理位置?”是的。

标签: memory-management operating-system virtual-memory


【解决方案1】:

在某些时候,物理位置必须有一个页表。用于此的方法取决于处理器。

让我举一个基于 VAX 处理器的简单示例。假设您将逻辑地址空间划分为所有进程共享的系统范围和每个进程唯一的用户范围。然后为每个范围赋予其自己的页表。

现在可以将用户页表放在逻辑地址空间的系统地址范围内了。

如果您访问用户空间中的内存,您将转到系统在系统空间中的逻辑地址处找到的页表,然后处理器必须使用系统空间的页表将其转换为物理地址;两级翻译。

如果您对系统空间页表使用逻辑地址,那么您将无法将它们转换为物理地址。相反,系统页表的本地是使用物理地址定义的。

另一种方法是使用物理地址定义所有页表。

【讨论】:

    【解决方案2】:

    我不明白操作系统本身是如何访问内存的。

    将操作系统视为一个进程。操作系统基本上是一个进程,就像其他进程一样,具有提升的特权。每当操作系统想要使用 eome 内存位置时,它都会使用页表来进行虚拟地址到物理地址的转换,就像其他进程一样。

    这样想:每个进程都有自己的页表,操作系统也是如此。操作系统会记住这些页表在与每个进程(例如 PCB)相关的控制结构中的位置,并且对于当前运行的进程,页表的地址(物理指针)保存在硬件中(对于 x86 架构,这是在控制寄存器 4 (CR4)) 中。在 x86 上,每当操作系统切换正在运行的进程时,它都会更改 CR4 中的值,以便地址指向正确的页表(如果切换到自己,则它自己的页表)。

    然而,这在现代操作系统中大大简化了,内核(操作系统)被映射到所有进程的内存空间中,这样内核就可以随时运行,而无需切换页表(代价高昂) )。属于内核的进程页表中的页面仅限于该进程,并且只有在内核控制执行某些管理任务时才能访问。

    【讨论】:

    • 我可以看到操作系统需要的额外内存如何分配给自己并在与其他进程相同的页表中进行跟踪。但是内核初次加载时,需要一个对应的页表。那么大概启动过程包括一个已知位置的内核页表?
    • 这取决于特定的 CPU 以及固件(或 BIOS)如何切换到内核。在操作系统上,我为早期内核程序集所做的第一件事编写了引导代码,即设置一个临时静态页表。这样,您就不必担心固件在将固件移交给内核之前离开 MMU 的状态。最好在另一个问题中询问有关其完成方式的确切细节。
    猜你喜欢
    • 2016-07-12
    • 2014-04-21
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    相关资源
    最近更新 更多