- Caffeinated 6.828:使用的工具
- Caffeinated 6.828:实验工具指南
- Caffeinated 6.828:实验 1:PC 的引导过程
- Caffeinated 6.828:实验 2:内存管理
- Caffeinated 6.828:实验 3:用户环境
- Caffeinated 6.828:实验 4:抢占式多任务处理
- Caffeinated 6.828:实验 5:文件系统、Spawn 和 Shell
- Caffeinated 6.828:实验 6:网络驱动程序
- Caffeinated 6.828:实验 7:最终的 JOS 项目
简介
这个实验分为三个部分。第一部分主要是为了熟悉使用 x86 汇编语言、QEMU x86 仿真器、以及 PC 的加电引导过程。第二部分查看我们的 6.828 内核的引导加载器,它位于 lab
树的 boot
目录中。第三部分深入到我们的名为 JOS 的 6.828 内核模型内部,它在 kernel
目录中。
软件安装
本课程中你需要的文件和接下来的实验任务所需要的文件都是通过使用 Git 版本控制系统来分发的。学习更多关于 Git 的知识,请查看 Git 用户手册,或者,如果你熟悉其它的版本控制系统,这个 面向 CS 的 Git 概述 可能对你有帮助。
本课程在 Git 仓库中的地址是 https://exokernel.scripts.mit.edu/joslab.git 。在你的 Athena 帐户中安装文件,你需要运行如下的命令去克隆课程仓库。你也可以使用 ssh -X athena.dialup.mit.edu
去登入到一个公共的 Athena 主机。
athena% mkdir ~/6.828
athena% cd ~/6.828
athena% add git
athena% git clone https://exokernel.scripts.mit.edu/joslab.git lab
Cloning into lab...
athena% cd lab
athena%
Git 可以帮你跟踪代码中的变化。比如,如果你完成了一个练习,想在你的进度中打一个检查点,你可以运行如下的命令去提交你的变更:
athena% git commit -am 'my solution for lab1 exercise 9'
Created commit 60d2135: my solution for lab1 exercise 9
1 files changed, 1 insertions(+), 0 deletions(-)
athena%
你可以使用 git diff
命令跟踪你的变更。运行 git diff
将显示你的代码自最后一次提交之后的变更,而 git diff origin/lab1
将显示这个实验相对于初始代码的变更。在这里,origin/lab1
是为了完成这个作业,从我们的服务器上下载的初始代码在 Git 分支上的名字。
在 Athena 上,我们为你配置了合适的编译器和模拟器。如果你要去使用它们,请运行 add exokernel
命令。 每次登入 Athena 主机你都必须要运行这个命令(或者你可以将它添加到你的 ~/.environment
文件中)。如果你在编译或者运行 qemu
时出现晦涩难懂的错误,可以双击 "check" 将它添加到你的课程收藏夹中。
如果你使用的是非 Athena 机器,你需要安装 qemu
和 gcc
,它们在 工具页面 目录中。为了以后的实验需要,我们做了一些 qemu
调试方面的变更和补丁,因此,你必须构建你自己的工具。如果你的机器使用原生的 ELF 工具链(比如,Linux 和大多数 BSD,但不包括 OS X),你可以简单地从你的包管理器中安装 gcc
。除此之外,都应该按工具页面的指导去做。
动手过程
我们为了你便于做实验,为你使用了不同的 Git 仓库。做实验用的仓库位于一个 SSH 服务器后面。你可以拥有你自己的实验仓库,其他的任何同学都不可访问你的这个仓库。为了通过 SSH 服务器的认证,你必须有一对 RSA 密钥,并让服务器知道你的公钥。
实验代码同时还带有一个脚本,它可以帮你设置如何访问你的实验仓库。在运行这个脚本之前,你必须在我们的 submission web 界面 上有一个帐户。在登陆页面上,输入你的 Athena 用户名,然后点击 “Mail me my password”。在你的邮箱中将马上接收到一封包含有你的 6.828
课程密码的邮件。注意,每次你点击这个按钮的时候,系统将随机给你分配一个新密码。
现在,你已经有了你的 6.828
密码,在 lab
目录下,运行如下的命令去配置实践仓库:
athena% make handin-prep
Using public key from ~/.ssh/id_rsa:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD0lnnkoHSi4JDFA ...
Continue? [Y/n] Y
Login to 6.828 submission website.
If you do not have an account yet, sign up at https://exokernel.scripts.mit.edu/submit/
before continuing.
Username: <your Athena username>
Password: <your 6.828 password>
Your public key has been successfully updated.
Setting up hand-in Git repository...
Adding remote repository ssh://[email protected]/joslab.git as 'handin'.
Done! Use 'make handin' to submit your lab code.
athena%
如果你没有 RSA 密钥对,这个脚本可能会询问你是否生成一个新的密钥对:
athena% make handin-prep
SSH key file ~/.ssh/id_rsa does not exists, generate one? [Y/n] Y
Generating public/private rsa key pair.
Your identification has been saved in ~/.ssh/id_rsa.
Your public key has been saved in ~/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
The keyʼs randomart image is:
+--[ RSA 2048]----+
| ........ |
| ........ |
+-----------------+
Using public key from ~/.ssh/id_rsa:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD0lnnkoHSi4JDFA ...
Continue? [Y/n] Y
.....
athena%
当你开始动手做实验时,在 lab
目录下,输入 make handin
去使用 git 做第一次提交。后面将运行 git push handin HEAD
,它将推送当前分支到远程 handin
仓库的同名分支上。
athena% git commit -am "ready to submit my lab"
[lab1 c2e3c8b] ready to submit my lab
2 files changed, 18 insertions(+), 2 deletions(-)
athena% make handin
Handin to remote repository using 'git push handin HEAD' ...
Counting objects: 59, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (55/55), done.
Writing objects: 100% (59/59), 49.75 KiB, done.
Total 59 (delta 3), reused 0 (delta 0)
To ssh://[email protected]/joslab.git
* [new branch] HEAD -> lab1
athena%
如果在你的实验仓库上产生变化,你将收到一封电子邮件,让你去确认这个提交。以后,你可能会多次去运行 run make handin
(或者 git push handin
)。对于一个指定实验的最后提交时间是由相应分支的最新推送(最后一个推送)的时间决定的。
在这个案例中,make handin
运行可能并不正确,你可以使用 Git 命令去尝试修复这个问题。或者,你可以去运行 make tarball
。它将为你生成一个 tar 文件,这个文件可以通过我们的 web 界面 来上传。make handin
提供了很多特殊说明。
对于实验 1,你不需要去回答下列的任何一个问题。(尽管你不用自己回答,但是它们对下面的实验有帮助)
我们将使用一个评级程序来分级你的解决方案。你可以使用这个评级程序去测试你的解决方案的分级情况。
第一部分:PC 引导
第一个练习的目的是向你介绍 x86 汇编语言和 PC 引导过程,你可以使用 QEMU 和 QEMU/GDB 调试开始你的练习。这部分的实验你不需要写任何代码,但是,通过这个实验,你将对 PC 引导过程有了你自己的理解,并且为回答后面的问题做好准备。
从使用 x86 汇编语言开始
如果你对 x86 汇编语言的使用还不熟悉,通过这个课程,你将很快熟悉它!如果你想学习它,PC 汇编语言这本书是一个很好的开端。希望这本书中有你所需要的一切内容。
警告:很不幸,这本书中的示例是为 NASM 汇编语言写的,而我们使用的是 GNU 汇编语言。NASM 使用所谓的 Intel 语法,而 GNU 使用 AT&T 语法。虽然在语义上是等价的,但是根据你使用的语法不同,至少从表面上看,汇编文件的差别还是挺大的。幸运的是,这两种语法的转换很简单,在 Brennan's Guide to Inline Assembly 有详细的介绍。
练习 1
熟悉在 6.828 参考页面 上列出的你想去使用的可用汇编语言。你不需要现在就去阅读它们,但是在你阅读和写 x86 汇编程序的时候,你可以去参考相关的内容。
我并不推荐你阅读 Brennan's Guide to Inline Assembly 上的 “语法” 章节。虽然它对 AT&T 汇编语法描述的很好(并且非常详细),而且我们在 JOS 中使用的 GNU 汇编就是它。
对于 x86 汇编语言程序最终还是需要参考 Intel 的指令集架构,你可以在 6.828 参考页面 上找到它,它有两个版本:一个是 HTML 版的,是老的 80386 程序员参考手册,它比起最新的手册更简短,更易于查找,但是,它包含了我们的 6.828 上所使用的 x86 处理器的所有特性;而更全面的、更新的、更好的是,来自 Intel 的 IA-32 Intel 架构软件开发者手册,它涵盖了我们在课程中所需要的、(并且可能有些是你不感兴趣的)大多数处理器的全部特性。另一个差不多的(并且经常是很友好的)一套手册是 来自 AMD 的。当你为了一个特定的处理器特性或者指令,去查找最终的解释时,保存的最新的 Intel/AMD 架构手册或者它们的参考就很有用了。
仿真 x86
与在一台真实的、物理的、个人电脑上引导