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