MatrixDog

重拾OS的实现

好久没看OS实现了- -。感觉最近过的乱七八糟的。最为一名学渣,苟活于学霸之间实在是很辛苦啊。不过还是感觉要坚持下去比较好,决定每天学一点,写点感想。也算是通过这个平台逼迫一下自己。= =#。

             今天回顾一下第一章的最小的操作系统。

              首先比不可少的自然是代码。

               

 1 org     07c00h
 2 mov     ax, cs
 3 mov     ds, ax
 4 mov     es, ax
 5 call    DispStr    
 6 jmp     $    
 7 DispStr:
 8 mov     ax, BootMessage
 9 mov     bp, ax    
10 mov     cx, 16    
11 mov     ax, 01301h    
12 mov     bx, 000ch    
13 mov     dl, 0
14 int     10h    
15 ret
16 BootMessage:    db    "Hello, OS world!"
17 times 510-($-$$)    db    0 
18 dw 0xaa55

                     使用nasm编译

              

1  nasm  boot.asm -o boot.bin

 

 

   使用dd命令写入

1 dd if = boot.bin of = boot1.img bs=512 count=1

 

                   效果如图所示:

 

首先分析一下操作系统的启动过程,在打开电源后,BIOS开始进行开机自检。系统开始检查软盘(因为我是从软盘启动的,硬盘就是0磁道0柱面1扇区 )上的0面0磁道1扇区。如果是以0xAA55(如果该区域是一个数组,就可以看做array[510]=0x55,array[511]=0xAA)结束,就认为是一个引导扇区。对于本例子,由于运行在虚拟机环境,写到扇区操作是通过那个dd命令完成的。

BIOS发现了引导扇区后,执行org  07C00,将程序调入0000:7c00处执行。

               关于
mov    ax, cs
mov    ds, ax
mov    es, ax
call    DispStr    
jmp $

                        cs 是代码段寄存器,用ax作为一个单独的中转,把代码段寄存器的值赋予ds(数据段)以及es(附加数据段)。这是一个初始化动作。目的是为了让后面的数据操作能定位到正确的位置(这是由寄存器本身的特性决定的)。call Dispstr并循环。jmp $;停止在这一步,不断循环。

                        

1 mov    ax, BootMessage
2 mov    bp, ax        
3 mov    cx, 16        
4 mov    ax, 01301h    
5 mov    bx, 000ch    
6 mov    dl, 0
7 int    10h        
8 ret

                        这里主要就是一个中断调用的过程。即调用bios的int 10;中断显示字符。

 

 

                       到这里我有几个问题其实不太懂。①这段命令生成的代码只能在Bochs里面运行,无法在实体裸机上运行。②关于汇编,我不懂内部运行的具体过程。只懂语法以及使用。为什么这段程序可以作为引导区程序在所有的机器上运行?不同的硬件的机器指令难道不是不通用的吗?

                        但愿以后会搞懂。。。。。。。

 

 

 

 

posted on 2014-11-28 00:29  matrixdog  阅读(107)  评论(0编辑  收藏  举报

导航