实现一个操作系统-工作环境及一个最小“操作系统”(windows下)

参考书籍:
《一个操作系统的实现》
《x86汇编语言 从实模式到保护模式》

随便说说:在一开始粗略浏览了《一个操作系统的实现》前2章之后,发现怎么无论在哪个环境下(windows和linux)都需要用到linux,而我现在基本都是用windows,无论装双系统还是虚拟机来运行linux都有点麻烦(不太熟悉linux)。。。后面在看完《x86汇编语言~》之后,发现在windows下即可完成所有工作。

环境:

操作系统:windows7

汇编编译器:nasm

虚拟硬盘或虚拟软盘制造工具:bochs/virtual box/win7(win7自身可以制造虚拟硬盘)
P.S.《一个操作系统的实现》书中用的是(虚拟)软盘启动,实则用虚拟硬盘也可以,个人感觉更方便。。。

硬盘(软盘)读写工具:winhex
P.S.虚拟/物理的均可读写。。。

查看二进制的工具:binary viewer
P.S.也可以用winhex查看

系统运行工具:virtual box

系统调试工具:bochs

最小”操作系统“

其实说与其这个是最小“操作系统”,还不如说它就是个类似hello world的小程序,只不过这个小程序使用汇编小的,并且不是通过操作系统打开的。。。

代码:

    mov ax,0xb872            ;显示缓冲区
    mov es,ax
    mov di,0

    mov ax,0                 ;字符串
    mov ds,ax
    mov si,str + 0x7c00      ;偏移地址

    mov bh,7
@l1:    
    mov ah,[ds:si]
    cmp ah,'#'
    je @end
    mov [es:di],ah
    inc si
    inc di
    mov [es:di],bh
    inc di
    jmp @l1

@end:   jmp $                ;无限循环

str:    db 'hello,welcome to the OS-World!!#'

    times 510 - ($ - $$) db 0
    dw 0xaa55

操作系统的启动

计算机启动后,执行BIOS系统,BIOS系统执行完后会把引导扇区加载到内存地址0000:7c00处,并跳转到该地址执行。

引导扇区:

引导扇区是启动介质的第一个扇区(0面0磁道1扇区),软盘、硬盘都是如此。(每个扇区大小为512字节)
而一个有效的引导扇区唯一的证明就是最后两个字节必须为0x55,0xaa(第511个字节:0x55,第512个字节:0xaa)

有了上面的信息,我们就知道只要把我们的“操作系统”放在引导扇区,便可以执行。
P.S.但其中要注意的是由于不是通过操作系统打开,因此没有地址重定位,调用代码中的地址/标志(偏移地址)时,必须加上该代码在内存中的加载地址,才的到实际地址,例如上面代码中str

    mov si,str + 0x7c00      ;偏移地址

str内存中实际地址 = str相对改代码开头的地址 + 该代码在内存中实际地址(0x7c00)

最后在virtual box下运行结果为:

运行结果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章