操作系统:实现引导扇区

操作系统:实现引导扇区电脑在启动时 在 BIOS 启动自检后 检查并将引导扇区加载到 7c00h 处 跳转到 7c00h 开始执行代码

大家好,欢迎来到IT知识分享网。

电脑在启动时,在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. 编译

nasm boot.asm -o boot.bin

然后打算以软盘的形式加载并执行这段代码,软盘采用1.44M大小的盘,BIOS的会检查软盘的0面0磁道1扇区,如果是引导扇区,即以0xaa55结束,就加载它。那么就需要将boot.bin写到软盘的第一个扇区。使用作者提供的FloppyWriter完成上述工作,得到Finix.img文件,如下:

-rw-r--r--. 1 root root  Sep 9 13:56 Finix.img

3. 运行

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即可运行,结果如下:

操作系统:实现引导扇区

虽然显示了很多其他的信息,但我们知道上面的代码已经可以运行了。

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://www.cnblogs.com/ljf9201314/archive/2008/07/21/1247653.html

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/153157.html

(0)
上一篇 2025-03-05 19:00
下一篇 2025-03-05 19:05

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信