编写OS第一步_编写引导程序boot
Posted 一只特立独行的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写OS第一步_编写引导程序boot相关的知识,希望对你有一定的参考价值。
1.boot的启动过程
在编写boot之前,我们需要知道boot是在操作系统中起什么作用。
1. 在Bios上电以后,会进行自我检查,然后查找boot程序,boot一般在磁盘的0号盘面0号磁道的1号扇区。
2. 在找到磁盘后,会直接查找起始地址为0x7c00的扇区,检查这个扇区是否是0xAA55结尾,如果是,则说明这个扇区是正确的引导扇区,将这个扇区的512B的内容加载到内存中。
注:0x7c00的算法
分配给操作系统引导区的大小为32kb,即从0x0000到0x7FFF,boot程序放在引导区的最后面,占512个字节。除此之外,还在boot程序后面预留了512个字节的位置。所以
0x7c00=0x7cFF - 512 - 512 + 1;
3. CPU开始执行内存中的boot模块。
2.编写boot.asm
文件放置在./src/boot/下面
org 0x7c00
jmp START;set correct CS
nop
StackBase equ 0x7c00 ;Macro definition,equals StackBase=0x7c00
BootMessage: db "Booting......"
START:
mov ax, cs
mov ds, ax
mov ss, ax
mov sp, StackBase
;print string "Booting"
mov al, 1
mov bh, 0
mov bl, 0x07 ;black background white words
mov cx, 13
mov dh, 0
;es=ds
push ds
pop es
mov bp, BootMessage ;offset address
mov ah, 0x13 ;13h interrupt
int 0x10
jmp $ ;died loop
;times n,m n:repeat conut m:data
times 510-($-$$) db 0 ;ensure 512B size $:now address $$:begin address
dw 0xaa55 ;boot sector flag
3.创建软盘
使用ssh -X root@ip 连接虚拟机,在虚拟机下转移到项目的根目录
运行如下指令
dd if=/dev/zero of=软盘名称.img bs=512 count=2880
查看软盘是否创建成功
file 软盘名称.img
如果出现boot sector,则说明引导盘设置成功。
4.将boot程序写入软盘
在项目根目录编译boot程序
nasm ./boot/boot.asm -o ./boot.bin
将boot.bin写入软盘
dd if=./boot.bin of=./软盘名称.img bs=512 count=1 conv=notrunc
5.运行引导程序
根据当前目录下的bochsrc,运行bochs
bochs -q
在bochs的最下方命令行处依次输入
b 0x7c00#在0x7c00处设置断点
c#执行
b 0x7c2d#在0x7c2d处设置断点
c#执行
6.执行结果
可以看到显示器出现了booting。。。。。,说明引导程序编写成功。
以上是关于编写OS第一步_编写引导程序boot的主要内容,如果未能解决你的问题,请参考以下文章
一步一步实现一个简单的OS(简单的让boot载入setup)