前言代码
废话不多说,先上代码:编译代码 运行代码
启动过程bochs配置
1 配置文件生成2 运行 自动化编译 前言
前面已经准备好开发环境,这里就开发一个最简单的引导程序。
两个目的:
本节源码位于: https://github.com/xqd-githup/xqd-os/tree/main/02
代码引导程序由于其特殊性,必须使用汇编来编写。本专栏的汇编代码除特殊情况外,一律使用gas编译的AT&T格式,而不是像其他博主那样采用NASM编译的Intel格式。理由是:
GAS与GCC贴合的非常好GAS的宏与伪指令及其强大Linux内核(除了早期的)中的汇编,一律使用GAS 废话不多说,先上代码://文件名为:boot.sBOOTSEG= 0x07C0.code16.textjmpl$BOOTSEG, $_start.global _start_start:// 初始化寄存器movw%cs, %axmovw%ax, %dsmovw%ax, %esmovw%ax, %ssmovw$0x7c00, %spshowMsg:// 调用0x10中断显示字符串movw$27, %cxmovb$0x07, %bl movw$msg1, %bpmovw$0x1301, %ax int$0x10 // 死循环end:jmp endmsg1:.ascii"Hello, Boot is startingrn".org 510boot_flag:.word 0xAA55
编译代码# 编译as -o boot.o boot.s# 链接ld -Ttext 0 -s --oformat binary -o boot boot.o
不出意外的情况下,可以得到一个512字节的boot文件,这就是我们的操作系统引导程序。
运行代码 启动过程这里先简单介绍一下计算机的启动过程:
按下主机电源按钮(这是废话)
读取BIOS
计算机首先读取主板上的一块ROM芯片,这块芯片里的程序是"基本输入输出系統"(Basic Input/Output System),即BIOS.
硬件自检 - 由BIOS执行
加载引导程序
BIOS在自检完毕后,会将启动设备的第一个扇区(512字节)加载到内存的0x7C00处,这个扇区里面的程序也叫引导程序,BIOS同时要求这个扇区的最后两个字节必须是0x55、0xaa。然后BIOS将CS、IP寄存器设置为0x0000、0x7c00,将处理器的执行权移交给引导程序。
加载内核
一个操作系统不可能仅仅512字节,所以引导程序一般不干其他事,主要是将操作系统内核加载到内存,然后将CPU的执行权移交给内核。
对于Linux操作系统,现在一般是通过grub2引导,引导扇区的程序会加载grub2主程序,grub2主程序根据配置文件展示启动菜单,然后加载Linux内核程序。
对于Windows操作系统(Win7/Win10),引导扇区的程序会加载主活动分区的bootmgr文件,bootmgr程序根据配置文件 展示启动菜单,然后加载Windows内核程序
执行内核程序
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”,然后保存。
执行命令: bochs -f bochsrc.os
在“
不能每次开发完都要敲一堆的命令,所以编写Makefile文件:
all: bootboot: boot.old -Ttext 0 -s --oformat binary -o boot boot.orun: boot bochsrc.osbochs -f bochsrc.osclean:rm boot *.o
编译代码的话,只需要执行命令make,运行的话只需要执行make run