0%

准备内核

1
2
3
4
git clone https://pdos.csail.mit.edu/6.828/2017/jos.git
sudo make # 编译
sudo make qemu-nox-gdb
sudo make gdb # 打开一个新终端

make命令详解

make

等价于 make all.

它是一个解释makefile中指令的命令工具

执行make时,默认会去(当前文件夹下),找名为Makefile的文件

根据Makefile文件来编译源代码,生成目标文件及可执行文件

在每次使用make时,都会重新生成objects,新产生的object会覆盖旧的objects

make clean

清除以前的make命令编译后所产生的object文件(即后缀为“.o”的文件)及其生成的可执行文件

一般来说,在每次使用make时,都会重新生成objects,新产生的object会覆盖旧的objects

但是实际用时,经过多次编译后,必须使用make clean(直接make,以前留下来的错误不能清除干净)

make install

将编译成功的可执行文件移动到make编译时填写的目录,依据生成的makefile文件

一般默认系统目录/usr/local/bin

make distclean

类似于make clean

清除以前的make命令编译后所产生的object文件(即后缀为“.o”的文件)及其生成的可执行文件,并将configure生成的文件全部删除掉

通常在使用make clean后使用,清理的更干净,避免影响再次编译

ROM BIOS启动过程

gdb简介

PC的物理结构

image-20220902091958099

该地址空间是物理空间,全部都是通过电路硬编码组成的。

本实验仿真的是80386处理器,该处理器32位,寻址空间2^32=4G。第一代 PC 基于16位 Intel 8088处理器,只能寻址1 MB 的物理内存。因此,早期 PC 的物理地址空间将以0x00000000开始,但以0x000FFFFF 而不是0xFFFFFFFF 结束。

Low Memory:早期个人电脑可以使用的唯一随机存取存储器(RAM,Random Access Memory,随机存取存储器,也称主存),为了兼容早期计算机而保存下来。00000H~003FFH: 1KB 中断向量区。

从0x000A0000到0x000FFFF 的384kB 区域是 ROM(Read-Only Memory,只读存储器) 部分,为特殊用途的硬件留下来的物理地址空间。

  • VGA Display:显存,向其写入数据,便可以被显示卡显示到显示屏上。外设。
  • expansion Roms:ROM 扩展。外设。
  • BIOS:基本输入/输出系统(Basic Input/Output System),占用从0x000F0000到0x000FFFFF 的64KB 区域。CPU 用于获取操作系统的一段程序,位于集成在PC内部的一个EPROM芯片(flash)中负责执行基本的系统初始化。
    • 建立中断描述符表(Interrupt Descriptor Table,IDT)。
    • 初始化各种设备,比如VGA PCI bus。
    • 寻找可启动的设备。
    • BIOS结束,进入磁盘(disk)中的内核引导器(boot loader)。

Extended Memory:另一部分的 RAM。

memory mapped devices:32位PCI设备(Program Control Interrupt,接收外部中断的设备,并行同步的总线)

由于JOS设计的限制, 在之后所有关于JOSlab中只使用前256M的物理内存。

ROM BIOS

1
2
3
4
5
The target architecture is assumed to be i8086
[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b # FFFF0H~FFFFFH 启动区
0x0000fff0 in ?? ()
+ symbol-file obj/kern/kernel
(gdb)

[CS:IP]:[代码段:指令指针]

实模式(Real Mode,程序中用到的地址都是真实的物理地址)下地址的计算方式:

1
2
3
4
地址 = 16 * CS + IP
16 * 0xf000 + 0xfff0 # 十六进制
= 0xf0000 + 0xfff0
= 0xffff0

该指令在BIOS区域的最后---倒数第16个字节,16字节做不了什么,于是跳到开头。

gdb 利用 si(Step Instruction) 进行单步追踪。

ljmp,跳到 CS=f000, IP=e05b 的地址。

The Boot Loader

软盘(Floppy),硬盘都可以被划分为一个个大小为512字节的区域(Magnetic Disk),叫做扇区(sector)。一个扇区是一次磁盘操作的最小单位。

如果一个磁盘是可以被用来启动操作系统的,就把这个磁盘的第一个扇区叫做启动扇区。

当BIOS找到一个可以启动的软盘或硬盘后,它就会把这512字节的启动扇区加载到内存地址0x7c00~0x7dff这个区域内。使用 ljmp 指令跳到 [0000,7c00] 后,控制权从 BIOS 交给了 Boot Loader,早期为一个扇区大小。

整个boot loader是由一个汇编文件,boot/boot.S,以及一个C语言文件,boot/main.c组成,其功能是:

  • 把 CPU 从实模式转换为32bit的保护模式,原来的地址空间只能够得到1MB(20 bits),现在可以到4GB(32 bits)。此时段偏移量从 16位变成了32位。
  • 通过使用x86特定的IO指令,直接访问IDE磁盘设备寄存器,从磁盘中读取内核。
1