ucore Lab1回忆录

Lab1:系统软件启动过程

bootloader的启动

我们的操作系统镜像文件uroce.img保存在硬盘disk上,其中前512个字节是引导扇区,存放了一个小软件bootloader,而后面存放的则是ucore内核文件。

当CPU加电启动时,将会默认执行位于固件上的BIOS程序(姑且认为它在内存中),当BIOS完成硬件自检后将选择系统盘当中引导扇区的512个字节加载到内存当中,此时CPU跳转到该位置执行bootloader

那么bootloader完成了一些什么事情呢?

  • 开启保护模式

    在Intel 80836运行模式中,为了向下兼容8086,在启动时实际上运行的时实模式。实模式下,只有20根地址线被使用,物理地址的大小只有1MB,此时程序访问的地址就是实际的物理地址。显然,这是不利于操作系统的安全的,因此我们需要保护模式。

    首先,打开A20开关,启用第20根地址线,可用物理内存达到4GB。

    随后,初始化全局描述符表GDT,它是段描述符表之一,顾名思义就是段描述符的数组,它的首地址在寄存器GDTR当中。

    那什么是段描述符呢?它主要包含3个方面的内容:段基址Base、段大小Limit、访问标志位。结合我们学过的分段机制,我们可以将一个程序的逻辑地址分为两部分:段选择子Selector偏移Offset。根据GDT[Selector].Base我们就能获取到程序的某一段(代码段、数据段…)在物理内存中的位置。

    通过分段机制,我们将逻辑地址转化为了线性地址(在这里也是物理地址)。

  • 加载ucore OS操作系统

    bootloader的一个重要作用就是加载OS到内存当中。ucore此时是一个可执行文件,以ELF文件格式存储在硬盘上。bootloader的功能就是读取硬盘,解析ELF文件,将操作系统内核分段加载到内存当中的各个部分,随后将控制权交给内核来执行。

操作系统开始运行

我们的系统不仅有CPU,还有许多其它的外设。如何使得外设也能够为操作系统所用呢?这就涉及到中断的初始化。操作系统将构建一个中断向量表IDT:保存了各个中断服务例程的入口地址。

而我们的中断服务例程(中断处理函数)是事先写好在操作系统内核的,在加载过程中只需将其地址复制到IDT当中即可。当中断被触发时,根据产生的中断向量查找中断向量表,就可以陷入内核态执行相应的程序。

当完成这些工作之后,操作系统就可以继续执行后面的代码了。Lab1当中的ucore将会打印一段字符串,随后进入while死循环当中。

猜你喜欢

转载自blog.csdn.net/leelitian3/article/details/104888559
今日推荐