xv6 exec系统调用

发布时间 2023-04-21 19:16:15作者: ijpq

exec是一个创建用户地址空间的系统调用。根据一个存储在文件系统中的file来创建用户地址空间。

具体来说,

int
exec(char *path, char **argv)
  1. exec 使用 namei 打开指定的二进制文件路径(kernel/exec.c:26)。

  2. exec 读取ELF(可执行与可链接格式)文件头。xv6应用程序遵循广泛使用的ELF格式,由kernel/elf.h定义。一个ELF二进制文件包含一个ELF文件头(struct elfhdr,位于kernel/elf.h:6)以及一系列程序段头(struct proghdr,位于kernel/elf.h:25)。每个proghdr描述了需要加载到内存中的应用程序的一个部分。xv6程序只有一个程序段头,但其他系统可能会为指令和数据分别设置不同的段。

  3. 首先,通过检查四字节的"magic number"(0x7F, 'E', 'L', 'F',或者 ELF_MAGIC(kernel/elf.h:3)),快速确认文件可能包含一个ELF二进制文件。如果ELF头具有正确的魔术数字,exec假设该二进制文件是格式正确的。

  4. exec使用proc_pagetable(kernel/exec.c:38)分配一个没有用户映射的新页表。

  5. 使用uvmalloc(kernel/exec.c:52)为每个ELF段分配内存,并使用loadseg(kernel/exec.c:10)将每个段加载到内存中。loadseg使用walkaddr查找分配内存的物理地址以在其上写入ELF段的每个页,并使用readi从文件中读取。

这个过程实现了将用户程序的二进制文件从文件系统加载到内存中的用户地址空间,并在适当的内存位置进行存储。在完成加载过程后,内核将控制权返回给用户程序,用户程序便可以在新的地址空间中开始运行。