Boot引导程序
BIOS引导原理写一个Boot引导程序创建虚拟机软盘镜像在Bochs上运行Boot程序
BootLoader引导启动程序原本由Boot引导程序和Loader引导加载程序两部分构成。Boot引导程序主要负责开机启动和加载Loader程序;Loader引导加载程序则用于完成配置和硬件工作环境、引导加载内核等任务。
计算机上电后,首先经过BIOS上电自检,这个过程会检测硬件设备是否有问题。如果检测没有问题的话,将根据BIOS的启动项配置选择引导设备,目前支持从硬盘,软盘,U盘,网络启动,通常情况下会选择硬盘作为默认启动项。
BIOS引导原理选择了启动设备后,会检测相应启动设备的第0磁头第0磁道第一个扇区是否以数值0x55和0xaa两个字节作为结尾。如果是,BIOS就认为这个扇区是一个引导扇区,会把此扇区的数据复制到物理内存0x7c00处,然后将处理器的执行权移交给这段程序。
由于磁盘的一个扇区只有512B所以是无法容纳一个操作系统的,所以Boot引导程序将功能更强大的引导加载程序Loader装载内存中,一旦Loader引导加载程序开始执行,一切都会交给我们编写的软件来控制,可以看作是硬件设备向软件移交控制权。
寄存器初始化部分。
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命令将引导程序强制写入虚拟软盘的固定扇区,这种方式可以绕过文件系统的管理和控制,直接操作磁盘扇区。
# 书上原本没有第1条命令,如果没有第一条命令后面会因为磁盘空间不足而复制loder程序失败 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。



