| « 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 |

July 5th, 2010 2:34 PM
楼主的文章写的很好,正在学习,期待下文