lab_1 清华大学ucore bootload启动ucore os(预备基础知识+实验过程)


实验1 :bootload启动ucore os

1.0实验内容:

lab1中包含一个bootloader和一个OS。这个bootloader可以切换到X86保护模式,能够读磁盘并加载ELF执行文件格式,并显示字符。而这lab1中的OS只是一个可以处理时钟中断和显示字符的幼儿园级别OS。bootload(引导装入)的翻译。

Lab1主要是关于操作系统如何启动,以及如何中断,函数调用栈相关的知识。

1.1 x86启动顺序

硬件启动后,怎么把操作系统放到内存中去运行。

1 BIOS启动过程

从BIOS到Bootload

CPU加电后,寄存器初始值为空。通过CS(16位的代码段寄存器)和EIP(指令指针寄存器)来决定启动的第一条指令的地址。

image-20220501193325026

image-20220501194116317

image-20220501194548581

计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CS:EIP确定,此时CS和IP的值分别是0xF000和0xFFF0))开始执行。在0xFFFFFFF0这里只是存放了一条跳转指令,通过跳转指令跳到BIOS例行程序起始点。

BIOS做完计算机硬件自检和初始化后,会选择一个启动设备(例如软盘、硬盘、光盘等),并且读取该设备的第一扇区的512字节(即主引导扇区或启动扇区)到内存一个特定的地址0x7c00处,然后CPU控制权会转移到那个地址继续执行。至此BIOS的初始化工作做完了,进一步的工作交给了ucore的bootloader。

2 bootloader启动过程

从Bootload(512字节)到OS

BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader。bootloader完成的工作包括:

  • 从实模式(16/20位寻址空间-1M)切换到保护模式(32位寻址空间-4G),启用分段机制。(为后续操作系统的执行做准备)
  • 读磁盘中kernel代码(ELF执行文件格式的ucore操作系统到内存
  • 显示字符串信息
  • 把控制权交给ucore操作系统

3 段机制

段机制内容:

image-20220501200200144

image-20220501200528504

image-20220501201113358

image-20220501201244442

总结:你需要建立好一个GDT(全局段描述符表),这里面每一项是一个段描述符,然后我还要把相应的段寄存器CS DS等设置好对应的index,是的CS,DS等这些段寄存器能够指向全局描述符表GDT对应的项。这个项我们称为段描述符,这个描述符指出映射关系,从而可以在使能了保护机制后,使段机制能够正常的工作。

4 加载ELF格式的ucore OS kernel

ucore编译之后会生成ELF格式的执行程序。

image-20220501202225560

image-20220501202324295

总结:能识别出很重要的一些关键信息,然后把相应的代码段 数据段从我们的文件读到我们的内存中来。

1.2 C函数调用的实现

具体细节上怎么实现系统调用

image-20220501210424664

其他注意事项:

参数和函数返回值可通过寄存器或位于内存中的栈来传递

不需要保存/恢复所有寄存器

1.3 gcc内联汇编

gcc是编译内核的一个编译器,有很方便的内联汇编。可以在C文件中嵌入汇编代码,就不用单独写一个汇编的文件。也有相应的规则。

image-20220501211128651

Example:

image-20220501211244346

asm代表内联汇编的关键字,然后把上一段汇编括起来,用引号表示一段字符串。%->%%

image-20220501211503753

image-20220501211559863

image-20220501211746817

image-20220501212007386

1.4 x86-32下的中断处理

一旦操作系统启动后,很重要的事情就是接管中断

中断源:

1.5 小结

1.6实验过程