参考书籍:
《一个操作系统的实现》
《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下运行结果为: