MIT 6.828 Operating System Engineering 2018 Lab1 for JOS

Lab 1: Booting a PCSection 0: IntroductionMIT 这门公开课是基于 x86 的一个简易的 OS kernel,我们想要了解 OS 的 topic 必须知道整个机器是如何上电启动的,比如你按下计算机的电源键,或者在 embedded device 上按下 reset button 整套 software 会怎么跑,最后进入我们熟知的 main funct...
摘要由CSDN通过智能技术生成

Lab 1: Booting a PC

Section 0: Introduction

MIT 这门公开课是基于 x86 一个简易的 OS kernel,我们想要了解 OS 的 topic 必须知道整个机器是如何上电启动的,比如你按下计算机的电源键,或者在 embedded device 上按下 reset button 整套 software 会怎么跑,最后进入我们熟知的 main function。

在不同的 Architecture 上,OS 被 hardware 带起来 (booting) 的方式是不同的。ARM 的 booting flow 和 X86 的 booting flow 发现其实都异曲同工。 简单来说整个 OS 起来的过程都是从 ROM -> Boot Loader -> OS control system。上电启动时 ARM 会去读取 physical address 0x0, 0x4 处内容分别设置好 stack pointer (SP) 和 program counter(PC)。然后 cpu 从 PC 里面 Reset Handler 的地址开始跑第一条指令。 接下来我们可以详细看 X86 的上电启动过程。

LAB 1 一共有12个问题,将逐一在后续解答。
环境设置:我是采用虚拟机上面跑 Ubuntu。
具体环境设置可以参考课程: https://pdos.csail.mit.edu/6.828/2018/tools.html
环境配置好后进入 dir 后应该如图所示,如果中间有疑问可以参考其他有关 MIT 6828 JOS 环境配置的 blog。
在这里插入图片描述

Section 1: PC Bootstrap

ROM -> Bootloader -> Kernel

这部分内容主要围绕硬件上电后的 sequence,此部分的代码无论在什么平台上应该是 non-volatile 的,即掉电之后依然在 memory 里面存在。RAM 掉电之后再上电则会丢失内容。 这部分 code 放的位置也是固定的,ARM 0x0 开始放,X86 放在 BIOS 处。之后会有 memory map 具体描述。

Q1
第一个问题其实没必要去完全理解整个 ASM language for X86,但这门课的预先要求其实还是蛮高的,最好要有良好的 C 语言背景,以及计算机组织架构的知识。
第二个问题让你会用 GDB 这里也不详细说了。
在这里插入图片描述

看整个 memory map 应该有一个 sense 就是哪段 memory 是 RAM ,哪段 memory 是 ROM。 具体装了什么 code, linker 的过程,以及 booting up 的过程会把 code 从哪里搬到哪里以及为什么。

这里总结一下:
上电后因为 CPU 架构的设计,会从 BIOS 0xFFFF0 开始跑 BIOS 的程序 The PC starts executing with CS = 0xf000 and IP = 0xfff0.
课程里面写到了这个信息,以及当我们使用 gdb 时第一条指令也是如此。

BIOS 接下来的工作就是为了把 Boot loader 从 Hard Disk 或者其他 memory 搬到 RAM 上面开始跑。(注意 RAM 的地址固定是 0x7C00)
BootLoader 和 kernel 你都可以自己随意 build (make),前提是 BIOS 固定, BootLoader LINK 的 address 必须 match 0x7C00。

BIOS 跑完后会开始跑 BootLoader,Bootloader 里面的 code 是为了让 kernel 跑起来做准备,同样也会从 disk 里面把 kernel 的 image 搬到特定地址开始跑 (0x100000)。

简而言之整个 flow 你可以看成两个 stage :
stage 1: ROM (BIOS 固化在memory中) -> Bootloader (从外面的memory里拿到 RAM 里跑)
stage 2: Bootloader -> Kernel

这样做的意义就是合理利用了整个 memory 的 architecture。
因为系统刚上来是没有运行 c code 的环境的所以要 BIOS 配置好硬件,然后再用一小段 code (Bootloader) 去 copy 较大的 kernel image。
有了这个整体的理解再好好回去读课程的介绍就会比较清晰。

When the BIOS runs, it sets up an interrupt descriptor table and initializes various devices such as the VGA display. This is where the “Starting SeaBIOS” message you see in the QEMU window comes from.

After initializing the PCI bus and all the important devices the BIOS knows about, it searches for a bootable device such as a floppy, hard drive, or CD-ROM. Eventually, when it finds a bootable disk, the BIOS reads the boot loader from the disk and transfers control to it.

我们可以更好地理解上述这段话。BIOS 我们看不到的,具体做了什么可以参考上述描述,总结就是 准备好硬件环境。

我之前做的ARM 的 ROM bootup (相当于BIOS) 其实也是要先开一些硬件,主要是设定一些寄存器 CPU/外设。

Section 2: PC Bootstrap

ROM -> Bootloader -> Kernel

现在进入 BootLoader (在 boot dir 里面的 boot.s, main.c)都可以看成 boot image。当 make 整个 project 的时候,会产生一个新的 directory ./obj,在下面有 boot,和 kernel 两个 folder。boot.out 就是生成的 img。其中 asm file 非常有用,特别是 debug 的时候,如果不会用 asm file debug 的话,这门课的预先要求其实是达不到的。

粗略来说就是一个 image 由 1.c, 2.c, 3.c 等 c source file 经过 compile 然后 link 最后产生了一个 image,同时 tool chain 也会给你一个 asm file,最后如果有.bin (里面全是0101这样的机器码)是由 tool chain 中相当于翻译官角色的编译器将 asm file (每个平台上有针对各自架构 cpu 指令集不同的编译器) 翻译成机器码,asm 可以让我们知道每个地址放的指令,以及 CPU 执行指令的顺序等重要信息。

在这里插入图片描述
Q1 :At what point does the processor start executing 32-bit code? What exactly causes the switch from 16- to 32-bit mode?
A : 读boot.s里面的注释较为清晰。

  lgdt    gdtdesc
  movl    %cr0, %eax
  orl     $CR0_PE_ON, %eax
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值