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