PC Bootstrap
第一个练习的目的是介绍x86汇编语言和PC bootstrap程序,使用QEMU和QEMU/GDB进行调试。这部分你不用写任何代码,但是不管怎样,你最好过一遍,并且回答文章后面的问题
x86汇编
如果你对x86汇编语言不熟悉,通过这个课程,你将很快熟悉它。PC Assembly Language Book是一个非常好的入门书籍,这本书混杂了最新和旧版本的信息
警告:不幸的是,这本书是用NASM汇编语言来编写的,然而,我们将使用GNU汇编。NASM使用所谓的Intel语法,然而GNU使用的是AT&T语法。两者的差异非常大,所幸的是,使用这个工具Brenman’s Guide to Inline Assembly,能够快速的转换
进行Exercise 1
当然,x86汇编语言编程的参考是Intel的白皮书,你可以在6.828的参考页找到两个版本:一个是老的80386 Programemer’s Reference Manual, 这个版本简短,也比较简单,但是描述了所有x86处理器的特征,6.828课程也是使用这个作为参考;另一个是最新版本的IA-32 Intel Architecture Soft Developer’s Manuals,最新版包含了最新处理器的所有特征,但是这个课程用不上,如果你感兴趣,可以阅读。还有一个关于AMD的手册相对来说更加友好,但是仅针对AMD的处理器
仿真x86
不是在真正的物理机上开发一个操作系统,而是使用模拟器模拟一个完整的PC。适用于模拟器的代码当然也可以在实际物理机器上跑。使用模拟器可以简化调试。例如,你可以设置在模拟的x86中设置断点,但是这个在实际的x86系统中却很难做到
在6.828课程中,我们将使用QEMU,QEMU可以配合GDB一起使用,进行调试。
在lab
目录输入make
,可以看到下面的输出
+ as kern/entry.S
+ cc kern/entrypgdir.c
+ cc kern/init.c
+ cc kern/console.c
+ cc kern/monitor.c
+ cc kern/printf.c
+ cc kern/kdebug.c
+ cc lib/printfmt.c
+ cc lib/readline.c
+ cc lib/string.c
+ ld obj/kern/kernel
ld: warning: section `.bss' type changed to PROGBITS
+ as boot/boot.S
+ cc -Os boot/main.c
+ ld boot/boot
boot block is 390 bytes (max 510)
+ mk obj/kern/kernel.img
如果你有类似于"undefined reference to __udivdi3
"这种错误,你可能没有32位gcc编译包,如果你运行在Ubuntu或Debian,尝试安装gcc-multilib
包。使用我的Dockerfile,不会出现这个问题
现在,你准备运行QEMU,装载obj/kern/kernel.img
文件,这个文件包含引导加载程序(obj/boot/boot)和内核(obj/kernel)
运行make qemu
(有界面)或者make qemu-nox
(无界面)。将会启动QEMU并且加载硬盘,成功进入系统。具体显示如下
6828 decimal is XXX octal!
entering test_backtrace 5
entering test_backtrace 4
entering test_backtrace 3
entering test_backtrace 2
entering test_backtrace 1
entering test_backtrace 0
leaving test_backtrace 0
leaving test_backtrace 1
leaving test_backtrace 2
leaving test_backtrace 3
leaving test_backtrace 4
leaving test_backtrace 5
Welcome to the JOS kernel monitor!
Type 'help' for a list of commands.
K>
PC物理地址空间
一个计算机的物理内存地址通常是下面的结构
+------------------+ <- 0xFFFFFFFF (4GB)
| 32-bit |
| memory mapped |
| devices |
| |
/\/\/\/\/\/\/\/\/\/\
/\/\/\/\/\/\/\/\/\/\
| |
| Unused |
| |
+------------------+ <- depends on amount of RAM
| |
| |
| Extended Memory |
| |
| |
+------------------+ <- 0x00100000 (1MB)
| BIOS ROM |
+------------------+ <- 0x000F0000 (960KB)
| 16-bit devices, |
| expansion ROMs |
+------------------+ <- 0x000C0000 (768KB)
| VGA Display |
+------------------+ <- 0x000A0000 (640KB)
| |
| Low Memory |
|