operating-system - 在没有虚拟内存支持的系统中链接和分页

标签 operating-system paging static-linking dynamic-linking virtual-memory

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

  • 在链接时重定位期间,链接器为生成的可执行文件中的每个节和每个符号分配运行时地址
  • 这些运行时地址是否对应于虚拟地址?
  • 如果生成可执行文件的系统不使用虚拟内存怎么办?

  • 接下来,如果不使用虚拟内存,那么应用程序的地址空间将被限制为加载时重定位后操作系统为其分配的物理地址空间
  • 如果不使用虚拟内存,是否会出现页面错误?

  • 我认为,确实如此:如果包含请求的物理地址的物理页面尚未存储在 RAM 中,则应该发生页面错误,这由 OS 页面错误处理程序提供服务
  • 最后,在没有虚拟内存的情况下是否可以进行分页?

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

    谢谢

    最佳答案

    哇,好多问题。

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

    相关文章:

    python - 用 Python 在给定目录及其子目录中递归替换文件中的字符串?

    database - 数据库事务是在操作系统中管理内存的好方法吗?

    sql - 获取分页 SQL 搜索存储过程的计数

    c++ - 如何设置 CMAKE 静态链接(对 `dlopen' 的 undefined reference )?

    ffmpeg - Android 上的静态链接 FFmpeg 库

    operating-system - 了解IDTR寄存器?

    windows - 用户变量和系统变量有什么区别?

    Mysql_Query 中的 PHP 分页

    arm - Aarch64 上同时存在不同大小的页面

    c - 是否可以强制将静态库中的字符串包含到链接它的任何可执行文件中?