(02)第一个操作系统引导程序

前言

前面已经准备好开发环境,这里就开发一个最简单的引导程序。
两个目的:

  1. 验证开发环境是否好用
  2. 熟悉各种工具(bochs、gcc、makefile)
  3. 体验操作系统的加载过程

本节源码位于: https://github.com/xqd-githup/xqd-os/tree/main/02

代码

引导程序由于其特殊性,必须使用汇编来编写。本专栏的汇编代码除特殊情况外,一律使用gas编译的AT&T格式,而不是像其他博主那样采用NASM编译的Intel格式。理由是:

  1. GAS与GCC贴合的非常好
  2. GAS的宏与伪指令及其强大
  3. Linux内核(除了早期的)中的汇编,一律使用GAS

废话不多说,先上代码:

//文件名为:boot.s

BOOTSEG		= 0x07C0		/* 引导程序加载的位置*/

.code16
.text
	jmpl	$BOOTSEG, $_start

.global _start
_start:
// 初始化寄存器
	movw	%cs, %ax
	movw	%ax, %ds
	movw	%ax, %es
	movw	%ax, %ss
	movw	$0x7c00, %sp

showMsg:
// 调用0x10中断显示字符串
	movw	$27, %cx
	movb	$0x07, %bl	
	movw	$0, %dx	 
	movw	$msg1, %bp
	movw	$0x1301, %ax	 
	int		$0x10			 

// 死循环
end:
	jmp end

msg1:
	.ascii	"Hello, Boot is starting\r\n"

.org 510
boot_flag:	.word 0xAA55


编译代码

# 编译
as -o boot.o boot.s
# 链接
ld -Ttext 0 -s --oformat binary -o boot boot.o

不出意外的情况下,可以得到一个512字节的boot文件,这就是我们的操作系统引导程序。

运行代码

启动过程

这里先简单介绍一下计算机的启动过程:

  1. 按下主机电源按钮(这是废话)

  2. 读取BIOS
    计算机首先读取主板上的一块ROM芯片,这块芯片里的程序是"基本输入输出系統"(Basic Input/Output System),即BIOS.

  3. 硬件自检 - 由BIOS执行

  4. 加载引导程序
    BIOS在自检完毕后,会将启动设备的第一个扇区(512字节)加载到内存的0x7C00处,这个扇区里面的程序也叫引导程序,BIOS同时要求这个扇区的最后两个字节必须是0x55、0xaa。然后BIOS将CS、IP寄存器设置为0x0000、0x7c00,将处理器的执行权移交给引导程序。

  5. 加载内核
    一个操作系统不可能仅仅512字节,所以引导程序一般不干其他事,主要是将操作系统内核加载到内存,然后将CPU的执行权移交给内核。
    对于Linux操作系统,现在一般是通过grub2引导,引导扇区的程序会加载grub2主程序,grub2主程序根据配置文件展示启动菜单,然后加载Linux内核程序。
    对于Windows操作系统(Win7/Win10),引导扇区的程序会加载主活动分区的bootmgr文件,bootmgr程序根据配置文件 展示启动菜单,然后加载Windows内核程序

  6. 执行内核程序

bochs配置

1 配置文件生成

执行bochs命令,选择4. Save options to…,输入文件名:bochsrc.os。
请添加图片描述
在当前目录下会生成一个bochsrc.os文件,打开这个文件, 将“# no floppya”这一行替换为“floppya: type=1_44, 1_44=“boot”, status=inserted, write_protected=0”,然后保存。

2 运行

执行命令: bochs -f bochsrc.os
在“<bochs:1>”提示符后面,输入c回车,不出意外的话,bochs运行界面的左上角会显示:Hello, Boot is starting。
请添加图片描述

自动化编译

不能每次开发完都要敲一堆的命令,所以编写Makefile文件:


all: boot

boot: boot.o
	ld -Ttext 0 -s --oformat binary -o boot boot.o
run: boot bochsrc.os
	bochs -f bochsrc.os

clean:
	rm boot *.o

编译代码的话,只需要执行命令make,运行的话只需要执行make run

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值