Linux等操作系统如何将可执行程序加载到虚拟内存中?

我已经从以下链接中阅读了此声明:

可执行目标文件和虚拟内存

启动可执行文件后,操作系统(内核)将创建虚拟地址空间和(最初为空)进程,并检查可执行文件的标头。

但是我不知道怎么回事examines the executable file's header

在操作系统可以检查可执行文件的标头之前,二进制文件是否应该首先加载到内存中?CPU无法直接在HDD上运行指令。

我猜加载程序应该能够在编译过程中看到分配给二进制文件的地址,并将其映射到新创建的虚拟内存。

同样,如果二进制文件是由OS加载的,则是否会完全加载?或者它确实延迟加载并根据需要的后缀加载页面。最初会加载多少?

内特·艾德雷奇

在操作系统可以检查可执行文件的标头之前,二进制文件是否应该首先加载到内存中?

好了,此步骤只需要将二进制文件标头加载到内存中即可。内核加载标头并对其进行检查,以了解如何为二进制文件的各个部分设置映射。标头可能会说,例如,“将二​​进制文件的字节4096-65535映射到地址0x12345000的内存中,只读且可执行”。“将地址为0xdeadf000的零初始化内存的16384字节映射为可读写”,依此类推。设置完这些映射后,内核不再需要将该二进制文件的标头保留在内存中,并且可以释放该空间。

另外,如果二进制文件由操作系统加载,是否会完全加载?

没有。

否则它会延迟加载并随后根据需要加载页面。

是。

最初会加载多少?

根本没有。当进程实际访问内存时,它可以依靠页面错误处理程序来执行此操作。在那种情况下,sysret或内核用来将控制权转移到程序入口点的任何指令本身都会引起页面错误,在该点上,将从二进制文件中加载由入口指定的包含入口点第一条指令的页面该地址的映射。当故障处理程序返回时,第一条指令将在内存中并被执行。随着该进程执行更多指令并占用更多内存,其页面将越来越多。

作为一种优化,内核可以根据对不久的将来可能访问哪些页面的猜测,将其中的某些页面预错误地存储到内存中。我不知道这在多大程度上完成了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Linux等操作系统如何将可执行程序加载到虚拟内存中?

来自分类Dev

在Linux中,当操作系统决定运行某个程序时,该如何将其加载到内存中?

来自分类Dev

如何将可执行文件加载到 RAM 中以进行定期调用?

来自分类Dev

操作系统:虚拟内存的大小是多少?

来自分类Dev

将可执行文件加载到当前进程的内存中,然后执行

来自分类Dev

每次在C#中运行程序时如何使用相同的虚拟内存块

来自分类Dev

进程如何尝试访问Linux虚拟内存系统中其他进程的内存

来自分类Dev

进程如何尝试访问Linux虚拟内存系统中其他进程的内存

来自分类Dev

是否有可以完全加载到RAM中的Linux操作系统?

来自分类Dev

Linux中虚拟内存的大小

来自分类Dev

如何找到Linux系统的虚拟内存大小和缓存大小?

来自分类Dev

测试操作系统时执行程序集“ sti”时,VirtualBox崩溃

来自分类Dev

如何将经过GPU训练的模型加载到CPU(系统)内存中?

来自分类Dev

虚拟机Linux操作系统

来自分类Dev

如何从程序集操作系统加载 .BAS 文件

来自分类Dev

系统如何定义进程获取的虚拟内存部分?

来自分类Dev

如何从终端启动可执行程序?

来自分类Dev

如何从终端启动可执行程序?

来自分类Dev

我可以通过在主机操作系统上运行程序来模拟虚拟机的某些硬件吗?

来自分类Dev

如何验证Windows XP POS操作系统可执行文件的真实性?

来自分类Dev

如何查看虚拟内存-Linux中每个进程维护的页表?

来自分类Dev

如何查看虚拟内存-Linux中每个进程维护的页表?

来自分类Dev

如何将可执行文件更改为应用程序?

来自分类Dev

ELF可执行文件的哪些部分被加载到内存中,在哪里?

来自分类Dev

vmlinux和虚拟内存中的Linux syscall

来自分类Dev

vmlinux和虚拟内存中的Linux syscall

来自分类Dev

除了使用系统调用时,我们何时才能进入进程虚拟内存的内核部分?(在Linux中)

来自分类Dev

libGDX:如何将屏幕正确加载到内存中?

来自分类Dev

Spark如何将数据加载到内存中

Related 相关文章

  1. 1

    Linux等操作系统如何将可执行程序加载到虚拟内存中?

  2. 2

    在Linux中,当操作系统决定运行某个程序时,该如何将其加载到内存中?

  3. 3

    如何将可执行文件加载到 RAM 中以进行定期调用?

  4. 4

    操作系统:虚拟内存的大小是多少?

  5. 5

    将可执行文件加载到当前进程的内存中,然后执行

  6. 6

    每次在C#中运行程序时如何使用相同的虚拟内存块

  7. 7

    进程如何尝试访问Linux虚拟内存系统中其他进程的内存

  8. 8

    进程如何尝试访问Linux虚拟内存系统中其他进程的内存

  9. 9

    是否有可以完全加载到RAM中的Linux操作系统?

  10. 10

    Linux中虚拟内存的大小

  11. 11

    如何找到Linux系统的虚拟内存大小和缓存大小?

  12. 12

    测试操作系统时执行程序集“ sti”时,VirtualBox崩溃

  13. 13

    如何将经过GPU训练的模型加载到CPU(系统)内存中?

  14. 14

    虚拟机Linux操作系统

  15. 15

    如何从程序集操作系统加载 .BAS 文件

  16. 16

    系统如何定义进程获取的虚拟内存部分?

  17. 17

    如何从终端启动可执行程序?

  18. 18

    如何从终端启动可执行程序?

  19. 19

    我可以通过在主机操作系统上运行程序来模拟虚拟机的某些硬件吗?

  20. 20

    如何验证Windows XP POS操作系统可执行文件的真实性?

  21. 21

    如何查看虚拟内存-Linux中每个进程维护的页表?

  22. 22

    如何查看虚拟内存-Linux中每个进程维护的页表?

  23. 23

    如何将可执行文件更改为应用程序?

  24. 24

    ELF可执行文件的哪些部分被加载到内存中,在哪里?

  25. 25

    vmlinux和虚拟内存中的Linux syscall

  26. 26

    vmlinux和虚拟内存中的Linux syscall

  27. 27

    除了使用系统调用时,我们何时才能进入进程虚拟内存的内核部分?(在Linux中)

  28. 28

    libGDX:如何将屏幕正确加载到内存中?

  29. 29

    Spark如何将数据加载到内存中

热门标签

归档