5
  • 首先,虚拟内存是系统的硬件特性,还是仅由操作系统实现?

在链接时重定位期间,链接器将运行时地址分配给生成的可执行文件中的每个部分和每个符号

  • 这些运行时地址是否对应于虚拟地址?

  • 如果生成可执行文件的系统不使用虚拟内存怎么办?

接下来,如果不使用虚拟内存,则应用程序的地址空间仅限于加载时重定位后操作系统为其分配的物理地址空间

  • 如果没有使用虚拟内存,是否会发生页面错误?

我认为,确实如此:如果包含请求的物理地址的物理页面尚未存储在 RAM 中,则应该发生页面错误,由 OS 页面错误处理程序提供服务

  • 最后,没有虚拟内存是否可以分页?

我问是因为分页总是与虚拟内存一起提到,但似乎不需要虚拟内存的存在来进行分页

谢谢

4

1 回答 1

3

哇,好多问题。

  • 虚拟内存在哪里实现?底层硬件需要​​支持虚拟内存。请记住,当您在程序中访问内存地址时,CPU 需要某种方式来获取属于该地址的数据。如果您只有物理访问权限,则操作将直接发送到内存控制器。在具有虚拟内存的系统中,您有一个MMU(内存管理单元),它将虚拟地址转换为物理地址。(请注意,一些微控制器提供了一个精简版本,称为内存保护单元(MPU),它不提供此转换步骤,但至少允许访问权限检查。)
  • 链接时地址是否对应于运行时的虚拟地址?通常,链接时地址对应于运行时虚拟地址。但是,有一种模式并非如此:位置无关代码。在这里,虚拟地址由动态链接器在加载时确定。这种方法通常用于将动态链接库 (DLL / .so) 加载到应用程序中。有关该主题的更多详细信息,您可能需要查看“链接器和加载器”
  • 如果我的目标系统没有虚拟内存怎么办?如果您的系统不支持虚拟内存,从编译器/加载器的角度来看,没有什么真正改变:您仍然需要生成代码来访问内存。唯一的区别是您的 CPU 不再进行从虚拟地址到物理地址的额外转换。
  • 如果没有虚拟内存,是否会出现页面错误?如果您没有虚拟内存,则不会出现页面错误。但是,在 MPU 的情况下,如果您的应用程序尝试访问不应读取/写入的地址,您可能仍会看到硬件报告的访问冲突。请注意,不需要将物理地址(更好:物理地址指向的数据)加载到 RAM 中。它们只是指向已经存在的 RAM 的指针。
  • 没有虚拟内存可以分页吗?“分页”和“虚拟内存”通常用于表示同一事物。然而,分页也可能指将内存分割成相同大小的块的概念——页面。您的问题的答案取决于分页的含义。;)
于 2012-08-04T23:49:09.173 回答