汇编实现引导程序
编写汇编码
; 文件名 boot.asm
org 7c00h ; BIOS读入MBR(Master Boot Record主引导记录)后,从0x7c00h处开始执行,所以这里把程序扔到内存的0x7c00h中去
; 下面部分和10h有关中断,10h中断用来显示字符
mov ax, cs
mov es, ax
mov ax, msg
mov bp, ax ; ES:BP表示显示字符串的地址
mov cx, msgLen ; CX存字符长度
mov ax, 1301h ; AH=13h表示向TTY显示字符,AL=01h表示显示方式(字符串是否包含显示属性,01h表示不包含)
mov bx, 000fh ; BH=00h表示页号,BL=0fh表示颜色
mov dl, 0 ; 列
int 10h ;10h代表显示器硬件对应的中断信号
msg: db "hello world, welcome to OS!"
msgLen: equ $ - msg ; 字符串长度
times 510 - ($ - $$) db 0 ; 因为整个程序不足512字节,需要填充剩余部分
dw 0aa55h ; 魔数,必须有这两个字节BIOS才确认是MBR
程序实现的就是一个系统引导程序,在屏幕中输入一段文字。
可以发现这就是一个硬中断的简单实践,实际上和软中断的调用过程类似,也是给出参数到对应的寄存器,然后进行中断操作,由内核做出对应的操作。
编译
nasm boot.asm -o boot.bin
制作启动软盘
1、 生成空白软盘镜像(软盘大小必须为1.44M,因此bs=1474560 )
dd if=/dev/zero of=floppy.img bs=1474560 count=1
2、制作包含主引导记录boot.bin的启动镜像文件(引导程序占512byte)
dd if=boot.bin of=myos.img bs=512 count=1
3、将第2步生成的bin引导镜像文件复制到空白软盘中,并在引导镜像内容后面的软盘内容补上空白,成为合适大小的软盘镜像,一共2880个扇区,略过第一个
dd if=floppy.img of=myos.img skip=1 seek=1 bs=512 count=2879
用软盘启动系统
1、将myos.img下载到windows
2、VMWare创建空的虚拟机
-
a、文件 - 创建新的虚拟机 - 典型
-
b、稍后安装操作系统
-
c、其他
-
d、一路next 完成
-
e、虚拟机设置,去掉CD/DVD选项中“启动时连接”
-
f、网络,选择“仅主机模式”,勾选“启动时连接”(好像无所谓)
-
g、添加软盘驱动器 使用软盘映像 找到myos.img
3、启动虚拟机
内存时模式
内存时模式指的是计算器启动后,内存里存放的内容结构。
从这里可以发现,操作系统的引导程序确实是在内存地址中的07C00H位置上。在这个引导程序之前的内存还存放了一些其他的东西,是关于一些例如BIOS自身的数据(例如我怎么输入了一串英文,但实质这对计算机来说就是一段01的数,如何让显示器可以把这段翻译成英文显示? 我猜测BIOS Data Area中就是装了这个映射的东西。
内存从引导程序再向上面看,发现还有一些固定的硬件之类的了。
为什么引导程序一定在07C00H?
简单来说,IBM最初约定的是在07C00H,但后续为了兼容性,就都统一都放在这个地方了。
参考:https://www.glamenv-septzen.net/en/view/6