写个超级简单的似引导又引导的BootSector.
首先说些题外话,你是一个对操作系统感兴趣的程序员吗?你编程吗?你是大学生吗?如果你是软件开发人员,你利用业余时间努力发展一个开源项目吗?
我先回答下,我对操作系统有浓厚的兴趣,我编程,我是过大学生,如今已不是,我不从事软件开发,但从事游戏开发,我业余有个业余项目,但是似乎发展有限。
好,现在进入正题,你看过《自己动手编操作系统》吗?看过后,我下面就帖一个那本书的第一个例子。然后结合我的感受,就是这篇文章了。
那本书的最激动人心莫过于第一个例子,在未介绍背景和需要的前置知识之前于渊就让初学者兴奋了一下,一会的功夫就写了一个基于80x86汇编的简单引导程序,可以在IBM PC上运行,但还不能引导Loader和Kernel.
代码如下:
org 0100h ; com Format
;org 07c00h
mov ax,cs
mov ds,ax
mov es,ax
call PrintStr
jmp $
PrintStr:
mov ax,HelloWorld
mov bp,ax
mov cx,24
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
ret
HelloWorld: db "Welcome to Lee's OS*_*";
times 510-($-$$) db 0
dw 0xaa55
代码我就不解释了,确实需要些汇编的基础才能看懂些。
但是我现在把这个BootSector更精简些,因为简单的东西更容易理解。下面是我精简后的BootSector
;Org 100h ; com Format
Org 7c00h
jmp $
dw 0xaa55
好,这个最精简的引导程序其实只需要四行。
Org用来定址,可以把各段初始化在同一基址,同时若在IBM PC裸机上执行,则把程序加载到内存的 100h 或7c00h
但是 Org 100h是把代码编译成com格式。
jmp $ 命令表示始终在当前行循环,是个死循环。
Dw 0xAA55 或 dw 0xaa55表示这个引导扇区。
好了,至此我给你一些你可以参考的说明。
有了这么小的引导扇区框架后,你可以利用你所知道的一切80x86中关于BIOS 和中断服务程序的知识。
如果你熟悉BIOS 调用,但不知道如何写BootSector的话,你现在就可以非常方便的扩充它了,但是不管怎么写,知道你写的代码量超过512字节,你可以利用虚拟机 Virtual PC VMWare Bochs等来测试下。
好为了师范扩充,我来演示下,在屏幕上输出个字符A,使用 BIOS的10中断。
Org 7c00h
Mov ax,0e41h
Int 10h
jmp $
dw 0xaa55
这样就可以在虚拟机上输出字符A并死循环了。
至此很神秘的BootSector居然可以这么简单。
好了,下面给出你需要深入学习的东西,第一保护模式,第二BIOS调用, 重点需要学习的BIOS中的关于写中断服务程序。
利用BIOS 13H来加载其它程序,Loader 内核等。
此外,写裸机上的程序可以通过这种方式来帮助消化关于保护模式的知识。 由于今天的IBM PC无论32位和64位下的用户软件都要受到和处理器配套的操作系统对虚拟地址,权限等的保护。所以我们的一般的应用程序都工作的保护模式下,且是工作在最低权限下。
但有一部分程序是工作在最高权限下,最高权限叫Ring0级。那么这类程序有哪些呢? 第一 系统程序,包括驱动程序,各种核心程序等。
第二 安全类程序,第三 杀毒类程序 第四还有各种调试程序等。
虽然也许我们不需要写操作系统,但是对于写工具软件,我们不得不了解些操作系统的细节,以让我们知道操作系统对我们的程序都做了什么操作,一但出现错误为什么会是这样,是我们的原因还是用户的原因。 此外,不光是操作系统有Bug,连Intel的处理器也都会有Bug.
只是我们不知道而已。