From b152d477f5ff0b6dc46d65a50af89745f7bcd2ef Mon Sep 17 00:00:00 2001 From: Yangyang Zhu <68588633+DavidZyy@users.noreply.github.com> Date: Tue, 25 Jan 2022 13:14:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=8F=E8=BF=B0=E4=B8=8D?= =?UTF-8?q?=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/chapter2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/chapter2.md b/content/chapter2.md index 85fc48e..7aaa7dd 100644 --- a/content/chapter2.md +++ b/content/chapter2.md @@ -69,7 +69,7 @@ xv6 使用从内核结尾到 `PHYSTOP` 之间的物理内存为运行时分配 `exec` 是创建地址空间中用户部分的系统调用。它根据文件系统中保存的某个文件来初始化用户部分。`exec`(5910)通过 `namei`(5920)打开二进制文件,这一点将在第 6 章进行解释。然后,它读取 ELF 头。xv6 应用程序以通行的 ELF 格式来描述,该格式在 `elf.h` 中定义。一个 ELF 二进制文件包括了一个 ELF 头,即结构体 `struct elfhdr`(0955),然后是连续几个程序段的头,即结构体 `struct proghdr`(0974)。每个 `proghdr` 都描述了需要载入到内存中的程序段。xv6 中的程序只有一个程序段的头,但其他操作系统中可能有多个。 -`exec` 第一步是检查文件是否包含 ELF 二进制代码。一个 ELF 二进制文件是以4个“魔法数字”开头的,即 0x7F,“E”,“L”,“F”,或者写为宏 `ELF_MAGIC`(0952)。如果 ELF 头中包含正确的魔法数字,`exec` 就会认为该二进制文件的结构是正确的。 +`exec` 第一步是检查文件是否包含 ELF 二进制代码。一个 ELF 二进制文件是以4字节的“魔法数字”开头的,即 0x7F,“E”,“L”,“F”,或者写为宏 `ELF_MAGIC`(0952)。如果 ELF 头中包含正确的魔法数字,`exec` 就会认为该二进制文件的结构是正确的。 `exec` 通过 `setupkvm`(5931)分配了一个没有用户部分映射的页表,再通过 `allocuvm`(5943)为每个 ELF 段分配内存,然后通过 `loaduvm`(5945)把段的内容载入内存中。`allocuvm` 会检查请求分配的虚拟地址是否是在 `KERNBASE` 之下。 `loaduvm`(1818) 通过 `walkpgdir` 来找到写入 ELF 段的内存的物理地址;通过 `readi` 来将段的内容从文件中读出。