【发布时间】:2019-04-21 19:53:33
【问题描述】:
我正在阅读有关逻辑和物理寻址的信息。我很困惑,当二进制文件运行时,它是先通过生成逻辑地址的CPU还是直接复制到物理内存?
【问题讨论】:
-
这可能取决于您所说的哪个操作系统?
标签: operating-system
我正在阅读有关逻辑和物理寻址的信息。我很困惑,当二进制文件运行时,它是先通过生成逻辑地址的CPU还是直接复制到物理内存?
【问题讨论】:
标签: operating-system
二进制文件在运行时,是先经过生成逻辑地址的CPU还是直接复制到物理内存?
通常某处的某些代码将可执行文件的标头加载到内存中,然后使用标头中的信息来确定文件的各个部分(例如.text、.data 等)应该在虚拟内存中的位置以及每个虚拟页面的虚拟权限应该是什么(如果允许写入,如果允许执行)。
在此之后,虚拟地址空间的区域被设置。通常这是通过将文件的相关部分内存映射到虚拟地址空间来完成的,而不是将它们实际加载到物理内存中。在这种情况下,每个页面的实际权限不反映页面的虚拟权限(例如,“读/写”页面最初可能“不存在”,当软件尝试从页面读取时,您将收到页面错误并且页面错误处理程序可能会从磁盘获取页面并将页面更改为“存在,只读”;然后当软件尝试写入该页面时,您可能会遇到第二个页面错误并且页面错误处理程序可能会执行“复制写”,这样使用相同物理页面的任何其他内容都不会受到影响,然后使新副本“读/写”以匹配原始虚拟权限)。
当这发生时;操作系统可以(取决于可用物理 RAM 的数量以及存储设备是否有更重要的数据要传输)从磁盘预取文件数据(例如进入 VFS 缓存),并且可以“机会性地”更新进程的页表以避免已预取的页面的页面错误开销。
但是;如果操作系统知道该文件位于不可靠和/或可移动媒体上,它可能会认为使用内存映射文件是一个坏主意,并且可能在执行之前将所需的可执行文件的部分实际加载到内存中;并且操作系统可能具有导致文件在执行之前被加载到 RAM 中的其他功能(例如,如果操作系统在允许执行文件之前检查可执行文件的数字签名是否正确,则可能需要加载整个文件到内存中以允许检查数字签名,在这种情况下,当设置虚拟地址空间时,整个文件可能仍在内存中。
【讨论】:
您需要阅读整本有关这些主题的书,并在上面花费数周时间
但是Operating Systems: Three Easy Pieces是一本好书,而且可以免费下载。
读完之后,也许还可以查看osdev.org 以了解实际情况。并且不要忘记诸如 Linux 之类的免费软件操作系统,例如 https://kernelnewbies.org/
【讨论】:
可执行文件通常是由加载程序执行的解释程序本身。可执行文件包含告诉加载器程序应该如何存在于虚拟内存中的指令。我的意思是,可执行文件中的指令定义了进程地址空间的初始虚拟表示。
因此,当可执行文件启动时,辅助存储中只有地址空间的虚拟表示。当程序执行时,它会反复启动页面错误以将页面加载到内存中。初始加载后,页面错误率下降。
可执行文件正常只包含逻辑地址。
【讨论】: