创建新进程时,使用fork()创建地址空间,即为新进程创建与父进程完全相同的新页表条目。 在fork()之后调用exec()。在exec()系统调用期间会发生什么?
我在“操作系统概念”一书中读到,当执行新程序时,该过程被赋予一个新的空VAS。这是否意味着在fork()期间创建的页表条目将被删除/ modifeid?空VAS是什么意思?
如何执行二进制到VAS的内存映射?如何知道VAS的哪些地址应该映射到相应的二进制文件?
我真的很困惑。
答案 0 :(得分:1)
当你调用exec时,内核将加载二进制文件并设置一组全新的页表(替换旧的表)。
加载器从二进制文件本身获取加载二进制文件的地址(基本上它是read()
来获取不是代码的头文件和东西,然后mmap()
来实际加载代码/数据的东西在二进制文件中
所以它查看了二进制文件,并确定了应该如何加载,mmap()
,传入一个地址来为需要位于不同位置的二进制文件的每个部分执行映射(即代码和数据部分可能是对mmap()
的两次不同调用,同时.bss部分将从/ dev / zero映射
请注意,根据操作系统和正在加载的二进制文件,一些内容可能由内核直接处理或由用户空间加载器处理(在UNIXish系统上ld将是加载器,它处理共享对象加载)