标签:style blog http io ar color os 使用 sp
好久没看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里面运行,无法在实体裸机上运行。②关于汇编,我不懂内部运行的具体过程。只懂语法以及使用。为什么这段程序可以作为引导区程序在所有的机器上运行?不同的硬件的机器指令难道不是不通用的吗?
但愿以后会搞懂。。。。。。。
标签:style blog http io ar color os 使用 sp
原文地址:http://www.cnblogs.com/matrixdogLOL/p/4127372.html