在没有虚拟内存支持的系统中进行链接和分页

man*_*sta 5 paging operating-system dynamic-linking virtual-memory static-linking

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

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

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

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

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

  • 如果不使用虚拟内存,会出现页面错误吗?

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

  • 最后,没有虚拟内存也可以进行分页吗?

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

谢谢

Bjo*_*rnD 3

哇,好多问题。

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