显示字符的toy bootloader

    通过分析和实现这个bootloader,读者可以了解到:

    • 与操作系统原理相关
      • I/O设备管理:设备管理的基本概念,涉及简单的信息输出
    • 计算机系统和编程
      • 硬件
        • PC加电后启动bootloader的过程
        • 通过串口/并口/CGA输出字符的方法
      • 软件
        • bootloader的文件组成
        • 编译运行bootloader的过程
        • 在汇编级了解栈的结构和处理过程

    proj1概述

    proj1实现了一个简单的bootloader,主要完成的功能是初始化寄存器内容,完成实模式到保护模式的转换,在保护模式下通过PIO方式控制串口、并口和CGA等进行字符串输出。

    其中一些比较重要的文件说明如下:

    • bootasm.S :定义并实现了bootloader最先执行的函数start,此函数进行了一定的初始化,完成了从实模式到保护模式的转换,并调用bootmain.c中的bootmain函数。
    • bootmain.c:定义并实现了bootmain函数实现了通过屏幕、串口和并口显示字符串。
    • asm.h:是bootasm.S汇编文件所需要的头文件,主要是一些与X86保护模式的段访问方式相关的宏定义。
    • types.h:包含一些无符号整型的缩写定义。
    • x86.h:一些用GNU C嵌入式汇编实现的C函数(由于使用了inline关键字,所以可以理解为宏)。
    • Makefile和function.mk:指导make完成整个软件项目的编译,清除等工作。
    • gdbinit:用于gdb远程调试的初始命令脚本

    从中,我们可以看出bootloader主要由bootasm.S和bootmain.c组成,当你完成编译后,你会发现这个bootloader只有区区的3百多字节。下面是编译运行bootloader的过程。

    【提示】bootloader是一个超小的系统软件,在功能上与我们一般的应用软件不同,主要用于硬件简单初始化和加载运行操作系统。在编写bootloader的时候,需要了解它所处的硬件环境(比如它在内存中的起始地址,它的储存空间的位置和大小限制等)。而这些是编写应用软件不太需要了解的,因为操作系统和编译器帮助应用软件考虑了这些问题。

    在proj1下执行make,在proj1/bin目录下可生成一个ucore.img。ucore.img是一个包含了bootloader或OS的硬盘镜像,通过执行如下命令可在硬件虚拟环境 qemu中运行bootloader或OS:

    我们除了需要了解bootloader的功能外,还需要进一步了解bootloader的编译链接和最终执行码的生成过程,从而能够清楚生成的代码是否是我们所期望的。proj1中的Makefile是一个配置脚本,make软件工具能够通过Makefile完成管理bootloader的C/ASM代码生成执行码的整个过程。Makefile的内容比较复杂,不过读者在前期只需会执行make [参数]来生成代码和清除代码即可。对于本实验的make的执行过程如下所示:

    如果需要了解Makefile中的内容,需要进一步看看附录“ucore实验中的常用工具”一节。