Operating system 不支持虚拟内存的系统中的链接和分页 首先,虚拟内存是系统的硬件特性,还是仅由操作系统实现

Operating system 不支持虚拟内存的系统中的链接和分页 首先,虚拟内存是系统的硬件特性,还是仅由操作系统实现,operating-system,paging,static-linking,dynamic-linking,virtual-memory,Operating System,Paging,Static Linking,Dynamic Linking,Virtual Memory,在链接时间重新定位期间,链接器将运行时地址分配给生成的可执行文件中的每个部分和每个符号 这些运行时地址是否对应于虚拟地址 如果生成可执行文件的系统不使用虚拟内存怎么办 接下来,如果未使用虚拟内存,则应用程序的地址空间将限制为加载时间重新定位后操作系统为其分配的物理地址空间 如果没有使用虚拟内存,是否会发生页面错误 我认为是这样的:如果包含请求的物理地址的物理页还没有存储在RAM中,那么应该发生页面错误,这是由OS页面错误处理程序提供服务的 最后,在没有虚拟内存的情况下可以进行分页吗

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

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

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

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

  • 如果没有使用虚拟内存,是否会发生页面错误
我认为是这样的:如果包含请求的物理地址的物理页还没有存储在RAM中,那么应该发生页面错误,这是由OS页面错误处理程序提供服务的

  • 最后,在没有虚拟内存的情况下可以进行分页吗
我这样问是因为分页总是和虚拟内存一起提到,但似乎不需要虚拟内存的存在来进行分页


谢谢

哇,有很多问题

  • 在哪里实现虚拟内存?底层硬件需要支持虚拟内存。请记住,当您访问程序中的内存地址时,CPU需要某种方法来获取属于该地址的数据。如果您只有物理访问权限,那么操作将直接发送到内存控制器。在具有虚拟内存的系统中,您有一个,它将虚拟地址转换为物理地址。(注意,一些微控制器提供了一个精简版本,称为内存保护单元(MPU),它不提供此转换步骤,但至少允许访问权限检查。)
  • 链接时间地址在运行时是否对应于虚拟地址?通常,链接时间地址对应于运行时虚拟地址。然而,有一种模式并非如此:位置独立代码。这里,虚拟地址由动态链接器在加载时确定。这种方法通常用于将动态链接库(DLL/.so)加载到应用程序。有关该主题的更多详细信息,请查看
  • 如果我的目标系统没有虚拟内存怎么办?如果您的系统不支持虚拟内存,从编译器/加载程序的角度来看,没有什么真正的改变:您仍然需要生成代码来访问内存。唯一的区别是CPU不再执行从虚拟地址到物理地址的额外转换
  • 如果没有虚拟内存,是否会出现页面错误?如果没有虚拟内存,则不会出现页面错误。但是,对于MPU,如果您的应用程序试图访问一个不应该读/写的地址,您可能仍然会看到硬件报告的访问冲突。注意,物理地址(更好:物理地址指向的数据)不需要加载到RAM中。它们只是指向已经存在的RAM的指针
  • 在没有虚拟内存的情况下可以进行分页吗?通常使用“分页”和“虚拟内存”来表示相同的内容。然而,分页也可能是指将内存分割成大小相同的块(页)的概念。你问题的答案取决于你所说的分页是什么意思
感谢您的回复,我有几个问题:在问题2中,您提到了位置独立代码,这是否意味着加载程序在加载时会再次重新定位此代码,即加载时重新定位?在问题3中,链接器在重新定位链接时分配给可执行文件的那个些地址将在加载时用作物理地址?在问题5中,分页指的是根据需要将页面从辅助内存带入RAM,这是页面错误的结果,但正如您在4中提到的,没有虚拟内存就没有页面错误,因此也没有按需分页。PIC代码:是的,重新定位是由动态链接器(Linux中的libld.so)完成的。3.对5.如果没有页面错误作为实际需求的指标,那么请求分页是很困难的。您的应用程序必须自行处理所有问题。我想,这就是为什么如果没有虚拟内存可用,可执行文件通常必须完全加载到内存中的原因。您至少需要加载负责加载所有其他代码的代码(例如磁盘驱动程序+二进制加载程序+他们需要的所有组件)。如果您不介意的话,还有一个问题:)您可能听说过vxworks操作系统,它可能使用两种虚拟内存模型中的一种:平板,它为每个进程分配特定范围的虚拟地址空间,并重叠,它为所有进程分配相同范围的虚拟地址空间。我并不真正理解平面虚拟机模型:它的行为好像根本没有虚拟内存,那么使用这个模型有什么意义呢?