操作系统:实现引导扇区
电脑在启动时,在BIOS启动自检后,检查并将引导扇区加载到7c00h处,跳转到7c00h开始执行代码。
0. 使用的工具
建议先看完本文,再选择安装。
- nasm (开源的汇编器 http://www.nasm.us/)
- Bochs (开源的X86硬件平台模拟器 http://bochs.sourceforge.net/)
- VirtualBox (虚拟机软件
https://www.virtualbox.org/)
1. 引导扇区代码
org 07c00h ; 告诉编译器将程序加载到7c00h处 mov ax, cs ; 取代码段段地址,此时应该为0 mov ds, ax ; 让数据段与代码段地址指向相同地址 mov es, ax ; 让附加段es与代码段地址指向相同地址 call DispStr ; 调用DispStr例程 jmp $ ; 无限循环,$ 表示编译后当前行指令地址 DispStr: ; 例程DispStr,显示一行字符串 mov ax, BootMessage ; 取字符串首地址 mov bp, ax ; CPU使用ES:BP寻址字符串 mov cx, 16 ; 将字符串长度放入 CX mov ax, 01301h ; AH = 13h表示输出字符串 AL = 01h写模式,01h表示字符串 ; 中仅包含字符,不包括字符属性,写完更新光标位置 mov bx, 000ch ; BH = 0h页数为0 BL表示字符串属性,0CH表示黑底红字 mov dl, 0 ; 显示位置,DH表示行,DL表示列 int 10h ; 调用BOIS中断10H ret BootMessage: db "Hello, MN world!" ; 定义字符串 db表示define byte times 510-($-$$) db 0 ; 填充剩余空间 $$表示该程序所在section的开始地址 ; 此处为7c00h dw 0xaa55 ; 扇区结束标志,如果已0xAA55结束,BIOS认为是一个合法 ; 的引导扇区,dw表示define word引导扇区长度一般长度为512字节。
2. 编译
上述的代码编译后生成512字节大小的二进制文件。编译命令:
nasm boot.asm -o boot.bin
然后打算以软盘的形式加载并执行这段代码,软盘采用1.44M大小的盘,BIOS的会检查软盘的0面0磁道1扇区,如果是引导扇区,即以0xaa55结束,就加载它。那么就需要将boot.bin写到软盘的第一个扇区。使用作者提供的FloppyWriter完成上述工作,得到Finix.img文件,如下:
-rw-r--r--. 1 root root 1474560 Sep 9 13:56 Finix.img
3. 运行
使用两种方式来运行它,分别使用Virtualbox和Bochs来运行。
3.1 Virtualbox
使用Virtualbox 5.0.2新建一个类型和版本都为Other类型的系统,内存32M,硬盘1G就足够用了。然后配置从软盘启动:
接着设置软盘的加载上述的Finix.img文件。
接着启动系统,运行结果:
3. 2 使用Bochs来运行
安装Boch 2.6.8。然后在Finix.img文件同目录新建一个文件Finix.bxrc,接着将如下内容写入到Finix.bxrc中:
############################################################### # bochsrc.bxrc file for Finix. ############################################################### # how much memory the emulated machine will have megs: 32 # filename of ROM images romimage: file=$BXSHARE/BIOS-bochs-latest vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest # what disk images will be used floppya: 1_44=Finix.IMG, status=inserted # choose the boot disk. boot: a # where do we send log messages? log: bochsout.txt # disable the mouse, since Finix is text only mouse: enabled=0 # enable key mapping, using US layout as default. keyboard: keymap=$BXSHARE/keymaps/x11-pc-us.map
不出意外双击Finix.bxrc即可运行,结果如下:
虽然显示了很多其他的信息,但我们知道上面的代码已经可以运行了。
如果配置过程出现了问题可以参考:http://blog.csdn.net/furzoom/article/details/52484413
4. 参考
于渊《自己动手写操作系统》
Writing 16-bit Code http://web.mit.edu/gnu/doc/html/as_18.html#SEC209
BIOS INT 10H调用 http://www.ctyme.com/intr/int-10.htm
Wiki INT 10H
https://en.wikipedia.org/wiki/INT_10H
INT 10H 的13H参数说明
http://blog.csdn.net/pdcxs007/article/details/43378229
关于INT 10H 13H的更多应用 http://www.cnblogs.com/ljf9201314/archive/2008/07/21/1247653.html
INT 10H 13H说明
http://www.itzhai.com/assembly-int-10h-description.html
版权声明:本文的版权归作者与博客园共同所有。转载时请在明显地方注明本文的详细链接,未经作者同意请不要删除此段声明,感谢您为保护知识产权做出的贡献。