BootLoader引导启动程序原本由Boot引导程序和Loader引导加载程序两部分构成。Boot引导程序主要负责开机启动和加载Loader程序;Loader引导加载程序则用于完成配置和硬件工作环境、引导加载内核等任务。
Boot引导程序
计算机上电后,首先经过BIOS上电自检,这个过程会检测硬件设备是否有问题。如果检测没有问题的话,将根据BIOS的启动项配置选择引导设备,目前支持从硬盘,软盘,U盘,网络启动,通常情况下会选择硬盘作为默认启动项。
BIOS引导原理
选择了启动设备后,会检测相应启动设备的第0磁头第0磁道第一个扇区是否以数值0x55和0xaa两个字节作为结尾。如果是,BIOS就认为这个扇区是一个引导扇区,会把此扇区的数据复制到物理内存0x7c00处,然后将处理器的执行权移交给这段程序。 由于磁盘的一个扇区只有512B所以是无法容纳一个操作系统的,所以Boot引导程序将功能更强大的引导加载程序Loader装载内存中,一旦Loader引导加载程序开始执行,一切都会交给我们编写的软件来控制,可以看作是硬件设备向软件移交控制权。
写一个Boot引导程序
寄存器初始化部分。
org 0x7c00;org指令将程序的起始地址设置为0x7c00,因为BIOS会加载引导程序至此处
BaseOfStack equ 0x7c00
Label_Start:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, BaseOfStack;初始化代码段,数据段,扩展段,堆栈段以及栈指针
通过BIOS中断服务程序INT 10h实现屏幕信息显示相关操作。
;======= clear screen
mov ax, 0600h;int 10h,ah=06h,al=0实现清屏功能
mov bx, 0700h;al=0,bx的值不生效
mov cx, 0;al=0,cx的值不生效
mov dx, 0184fh;al=0,dx的值不生效
int 10h
;======= set focus
mov ax, 0200h;int 10h,ah=02h,设置屏幕光标位置
mov bx, 0000h;页码
mov dx, 0000h;将光标设置到屏幕左上角(0,0)处
int 10h
;======= display on screen : Start Booting......
mov ax, 1301h;int 10h,ah=13h,al=01h,显示字符串,光标移动至字符串尾端位置
mov bx, 000fh;设置字符显示属性,白字,黑底,高亮,不闪烁
mov dx, 0000h;从(0,0)处开始显示
mov cx, 10;要显示的字符串的长度
push ax;保存ax寄存器
mov ax, ds
mov es, ax;设置要显示的字符串的段基址
pop ax
mov bp, StartBootMessage;设置要显示的字符串的偏移地址
int 10h
定义一个字符串和引导程序的结束标识数据。
StartBootMessage: db "Start Boot"
;======= fill zero until whole sector
times 510 - ($ - $$) db 0
dw 0xaa55;引导扇区标识
创建虚拟机软盘镜像
安装好Bochs虚拟机源码后,会生成磁盘镜像创建工具bximage。可以使用bximage命令创建虚拟软盘镜像文件。使用bximage根据提示创建一个名为boot.img,大小为1.44MB的软盘。
在Bochs上运行Boot程序
使用nasm命令将boot.asm源文件编译成二进制文件。
nasm boot.asm -o boot.bin
将编译好的二进制文件写入虚拟软盘镜像文件内。使用dd命令将引导程序强制写入虚拟软盘的固定扇区,这种方式可以绕过文件系统的管理和控制,直接操作磁盘扇区。
dd if=/dev/zero of=./bochs-2.6.8/boot.img count=204
dd if=boot.bin of=./bochs-2.6.8/boot.img count=1 bs=512 conv=notrunc
使用bochs -f ./bochsrc启动Bochs虚拟机,执行选项6。
|