我已经从以下链接中阅读了此声明:
启动可执行文件后,操作系统(内核)将创建虚拟地址空间和(最初为空)进程,并检查可执行文件的标头。
但是我不知道怎么回事examines the executable file's header
?
在操作系统可以检查可执行文件的标头之前,二进制文件是否应该首先加载到内存中?CPU无法直接在HDD上运行指令。
我猜加载程序应该能够在编译过程中看到分配给二进制文件的地址,并将其映射到新创建的虚拟内存。
同样,如果二进制文件是由OS加载的,则是否会完全加载?或者它确实延迟加载并根据需要的后缀加载页面。最初会加载多少?
在操作系统可以检查可执行文件的标头之前,二进制文件是否应该首先加载到内存中?
好了,此步骤只需要将二进制文件的标头加载到内存中即可。内核加载标头并对其进行检查,以了解如何为二进制文件的各个部分设置映射。标头可能会说,例如,“将二进制文件的字节4096-65535映射到地址0x12345000的内存中,只读且可执行”。“将地址为0xdeadf000的零初始化内存的16384字节映射为可读写”,依此类推。设置完这些映射后,内核不再需要将该二进制文件的标头保留在内存中,并且可以释放该空间。
另外,如果二进制文件由操作系统加载,是否会完全加载?
没有。
否则它会延迟加载并随后根据需要加载页面。
是。
最初会加载多少?
根本没有。当进程实际访问内存时,它可以依靠页面错误处理程序来执行此操作。在那种情况下,sysret
或内核用来将控制权转移到程序入口点的任何指令本身都会引起页面错误,在该点上,将从二进制文件中加载由入口指定的包含入口点第一条指令的页面该地址的映射。当故障处理程序返回时,第一条指令将在内存中并被执行。随着该进程执行更多指令并占用更多内存,其页面将越来越多。
作为一种优化,内核可以根据对不久的将来可能访问哪些页面的猜测,将其中的某些页面预错误地存储到内存中。我不知道这在多大程度上完成了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句