操作系统:实现引导扇区

电脑在启动时,在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就足够用了。然后配置从软盘启动:

操作系统:实现引导扇区_第1张图片

接着设置软盘的加载上述的Finix.img文件。

操作系统:实现引导扇区_第2张图片

接着启动系统,运行结果:

操作系统:实现引导扇区_第3张图片

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张图片

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

如果配置过程出现了问题可以参考: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


你可能感兴趣的:(OS,一起写操作系统)