编写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

一个汇编写的boot程序

2.3.2 引导Spring Boot应用程序:编写引导类

一步一步实现一个简单的OS(简单的让boot载入setup)

在 Mac OS 上使用 TypeScript 编写 ASP.NET 5 应用

nasm 引导扇区中可能存在语法问题