Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

修改描述不规范 #83

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion content/chapter2.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` 来将段的内容从文件中读出。

Expand Down