LAB_1_Part1_PC Bootstrap

1. LAB_1_Booting a PC

Lab 1: Booting a PC

GDB调试中常用指令:
LAB_1_Part1_PC Bootstrap_第1张图片

1.1. 简介

实验分为三个部分:

  • 熟悉汇编语言、QEMU x86模拟器、PC上电启动过程
  • 检查我们的6.828内核的boot loader程序,它位于labboot目录下。
  • 深入研究6.828内核本身的初始模板,位于kernel目录下。

1.2. QEMU安装

在VMware虚拟机上运行Ubuntu16.04,虚拟机的安装教程网上很多,此处就不再重复。直接用apt-get安装qemu.

sudo apt-get install qemu

有一位热心博友上传了6.828mit的源码,并且还记录了其完成所有lab的过程,我也是follow着一路走下来的,大家可以去看看fatsheep9146。我们可以直接从获取github上获取JOS的源码

git clone https://github.com/fatsheep9146/6.828mits

1.3. Part 1: PC Bootstrap

cd lab
# 编译源码
make 
# qemu 模拟x86环境,运行minimal kernel
make qemu

运行成功的话终端就会打印出以下字符:

6828 decimal is 015254 octal!
Physical memory: 66556K available, base = 640K, extended = 65532K
check_page_alloc() succeeded!
check_page() succeeded!
check_kern_pgdir() succeeded!
check_page_installed_pgdir() succeeded!
[00000000] new env 00001000
Incoming TRAP frame at 0xefffffbc
Incoming TRAP frame at 0xefffffbc
hello, world
Incoming TRAP frame at 0xefffffbc
i am environment 00001000
Incoming TRAP frame at 0xefffffbc
[00001000] exiting gracefully
[00001000] free env 00001000
Destroyed the only environment - nothing more to do!
Welcome to the JOS kernel monitor!
Type 'help' for a list of commands.
K> 

键入kerninfo,值得注意的是,此内核监视器“直接”在模拟PC的“原始(虚拟)硬件”上运行。

1.3.1. 细节记录

  • PC中BIOS大小为64k, 物理地址范围0x000f0000-0x000fffff
    PC 开机首先0xfffff0处执行 jmp [0xf000,0xe05b] 指令。在gdb中使用si(Step Instruction)进行跟踪。
(gdb) si
[f000:e05b]    0xfe05b:	cmpw   $0xffc8,%cs:(%esi)   # 比较大小,改变PSW
0x0000e05b in ?? ()
(gdb) si
[f000:e062]    0xfe062:	jne    0xd241d416           # 不相等则跳转
0x0000e062 in ?? ()
(gdb) si
[f000:e066]    0xfe066:	xor    %edx,%edx            # 清零edx
0x0000e066 in ?? ()
(gdb) si
[f000:e068]    0xfe068:	mov    %edx,%ss
0x0000e068 in ?? ()
(gdb) si
[f000:e06a]    0xfe06a:	mov    $0x7000,%sp
0x0000e06a in ?? ()

BIOS运行过程中,它设定了中断描述符表,对VGA显示器等设备进行了初始化。在初始化完PCI总线和所有BIOS负责的重要设备后,它就开始搜索软盘、硬盘、或是CD-ROM等可启动的设备。最终,当它找到可引导磁盘时,BIOS从磁盘读取引导加载程序并将控制权转移给它。

你可能感兴趣的:(MIT6.828操作系统)