Jun 10 2010

1. “Hello world” ── 引导程序(Boot loader)

Category: OSDevwuxicn @ 9:23 AM
« Previous TOP » Next

======

1. “Hello world” ── 引导程序(Boot loader)

做好了准备工作,现在可以开始写操作系统了。一般学习编程的第一个程序都是“hello world”,因此我们的操作系统也不例外。下面看看用10分钟的时间如何写一个可以在裸机(虚拟机)上直接运行的“操作系统”。

我们的 “Hello world” 操作系统

;; File    : t1.asm
;; Author  : wuxi
;; Date    : 2010.6.9
;; Tutorial: http://icoder.me/osdev-tutorial/
;; Project : http://code.google.com/p/myminios
;;
    org 0x7c00  ; BIOS自检完后将转到内存绝对地址7c00处继续执行
    jmp _start

_start:
    xor ax, ax  ; make it zero
    mov ds, ax
    mov es, ax

;; 设置BIOS输出的属性(其实位置、颜色)
    xor dx, dx
    mov bx, 0x000e

;; 通过BIOS的INT 10H中断输出文字
    mov bp, msg
    mov cx, msglen
    mov al, 1
    mov ah, 0x13
    int 0x10

;; 挂起
    jmp $

;; 文字常量:
msg db "Hello OS world!", 0
msglen equ $ - msg   ; 文字串的长度

;; 引导程序标记:以 0x55 0xaa 结尾
    times 510 - ($ - $$) db 0
    db 0x55
    db 0xaa

上面这段代码可以在http://code.google.com/p/myminios里下载到,在其目录下输入:”make t1” 就会编译并生产a.img文件,然后直接在虚拟机里将a.img作为磁盘镜像启动就能看到在屏幕的第一行显示一串黄色的“Hello OS world!”文字。

手工进行编译可以这样做:nasm -o t1.bin t1.asm

其实这不是一个真正意义上的操作系统,这只是一个引导程序。但是无论如何,这个程序不需要任何系统,直接在裸机上运行,我们的操作系统就可以在这个基础上逐渐扩展而来。

“Hello world” 的解释

当BIOS自检完后,他将会把启动盘的第一个扇区(0面、0磁道、1扇区)的这512字节内容加载到内存的0x7c00位置,然后跳转到0x7c00位置,将执行权交给这个位置的程序。因此,我们程序的第一条命令 “org 0x7c00” 就是告诉汇编编译器(nasm)这个程序将被加载到内存0x7c00位置。

并且,此时不管你是32位机器还是64位机器,现在都是运行在16位实模式(real mode)[1]下。因此,寻址范围只有1M Byte.

接下来,我们通过调用BIOS提供的INT 10H服务[2]将msg(也就是”Hello OS world!”字符串输)出到了屏幕上。
调用方法很简单,将参数值存入对应寄存器(如字符串起始地址存入寄存器BP),然后通过命令 “int 0×10” 让BIOS帮我们输出字符串。具体各个参数的意义可以参见文献[2].

好了,现在一个可以在裸机上独立运行的引导程序雏形已经有了,接下来教程中我们将在它的基础上进行扩展,逐步将它扩展成我们的操作系统。

References

[1] Real Mode. http://www.deinmeister.de/x86modes.htm#pa

[2] INT 10 : BIOS Video services. http://www.uv.tietgen.dk/staff/mlha/pc/Prog/asm/int/INT10.htm

======

« Previous TOP » Next

Tags: ,

One Response to “1. “Hello world” ── 引导程序(Boot loader)”

  1. huangwei says:

    楼主的文章写的很好,正在学习,期待下文

Leave a Reply