OS 例如 Linux 如何将可执行文件加载到虚拟内存中?
How does an OS such as Linux load executables into virtual memory?
我读过这篇link的声明:
When an executable file is started, the OS (kernel) creates a virtual address space and an (initially empty) process, and examines the executable file's header.
但我不明白 examines the executable file's header
是怎么发生的?
在OS可以检查可执行文件的header之前,二进制文件不应该首先加载到内存中吗? CPU不能运行直接在硬盘上指令。
我猜 Loader 应该能够在编译期间看到分配给二进制文件的地址并将它们映射到新创建的虚拟内存。
此外,如果二进制文件由 OS 加载,是否会完全加载?或者它会延迟加载并根据需要加载页面。最初会加载多少?
Shoudn't the binary be loaded in memory to begin with, before the OS can examine the executable file's header?
嗯,只有 header 的二进制文件必须加载到内存中才能执行此步骤。内核加载 header 并检查它以查看如何为二进制文件的各个部分设置映射。例如,header 可能会说“将二进制文件的第 4096-65535 字节映射到地址为 0x12345000 的内存中,read-only 和可执行文件”; “在地址 0xdeadf000,read-write 处映射 zero-initialized 内存的 16384 字节”,等等。设置好这些映射后,内核就不需要再在内存中保留二进制文件的header,可以释放space.
Also in case the binary is loaded by the OS, does it get loaded entirely?
没有
or it does lazy loading and loads pages as needed afterwards.
是的。
How much would it load initially?
可能根本 none。当进程实际访问内存时,它可以依赖页面错误处理程序来执行此操作。在那种情况下,sysret
或内核用来将控制转移到程序入口点的任何指令本身都会导致页面错误,此时包含入口点第一条指令的页面将从该地址的映射指定的二进制文件。当故障处理程序返回时,第一条指令将在内存中并被执行。随着进程执行更多涉及更多内存的指令,将加载越来越多的页面。
内核可以作为优化,prefault 将这些页面中的一些页面放入内存,基于对哪些页面可能在不久的将来被访问的猜测。我不知道具体做到了多少。
我读过这篇link的声明:
When an executable file is started, the OS (kernel) creates a virtual address space and an (initially empty) process, and examines the executable file's header.
但我不明白 examines the executable file's header
是怎么发生的?
在OS可以检查可执行文件的header之前,二进制文件不应该首先加载到内存中吗? CPU不能运行直接在硬盘上指令。
我猜 Loader 应该能够在编译期间看到分配给二进制文件的地址并将它们映射到新创建的虚拟内存。
此外,如果二进制文件由 OS 加载,是否会完全加载?或者它会延迟加载并根据需要加载页面。最初会加载多少?
Shoudn't the binary be loaded in memory to begin with, before the OS can examine the executable file's header?
嗯,只有 header 的二进制文件必须加载到内存中才能执行此步骤。内核加载 header 并检查它以查看如何为二进制文件的各个部分设置映射。例如,header 可能会说“将二进制文件的第 4096-65535 字节映射到地址为 0x12345000 的内存中,read-only 和可执行文件”; “在地址 0xdeadf000,read-write 处映射 zero-initialized 内存的 16384 字节”,等等。设置好这些映射后,内核就不需要再在内存中保留二进制文件的header,可以释放space.
Also in case the binary is loaded by the OS, does it get loaded entirely?
没有
or it does lazy loading and loads pages as needed afterwards.
是的。
How much would it load initially?
可能根本 none。当进程实际访问内存时,它可以依赖页面错误处理程序来执行此操作。在那种情况下,sysret
或内核用来将控制转移到程序入口点的任何指令本身都会导致页面错误,此时包含入口点第一条指令的页面将从该地址的映射指定的二进制文件。当故障处理程序返回时,第一条指令将在内存中并被执行。随着进程执行更多涉及更多内存的指令,将加载越来越多的页面。
内核可以作为优化,prefault 将这些页面中的一些页面放入内存,基于对哪些页面可能在不久的将来被访问的猜测。我不知道具体做到了多少。