手把手教你做操作系统(二)
第二天:
先大概理个头绪,我们要做的操作系统,究竟是个什么样子的?究竟可以有哪些功能?
列个单子放在下面:
1, 代码行:最多10000行(因为是一个人做,太大的系统不现实);
2, 是real-time os还是time-sharing os?
我选time-sharing os,这样就可以和我们的“UNIX操作系统”课联系起来,可以省不少事呢。
3, 支持多任务吗?
既然是time-sharing os,那肯定是多任务的了。
4, 除了“设备管理,存储管理,文件管理”这些该有的功能外,系统还应该有什么功能?
考虑到工作量,暂时只想有个上网功能。
5, 是字符界面还是图形化界面?
实在点,就字符界面吧。说“图形化”界面,那是和自己的生命开玩笑!!!
6, 用不用虚拟存储器的功能?
用!
还有,确定下操作系统的大概分块:初启;存储管理;文件管理;系统调用(接口—库函数);系统重要函数;中断处理函数(汇编编写)。
OK,准备工作做的差不多了,大体的思想也有了,现在就可以甩开膀子大干一场啦。
今天先搞定系统的初启。
了解下系统初启的过程:
1, 硬盘初启:I,通电;
II,BIOS自检。在内存中的自检地址为0FFFF:0000。(注:这个时候还是在实模式下)。自检内容:CPU,主板,内存,硬盘,I/O设备。
III,计算机将主引导区MBR的512B的引导代码读入0000:7C00(好怪的位置,我也不知道为什么)。
IV,检查0000:7DFE(即被读入内容的最后两个字节)的内容是否为0XAA55(0XAA55标志该引导代码是否合法)。要是不等,则不执行引导代码,死机。
V,跳转到0000:7C00执行引导代码。
VI,MBR先将自己复制到0000:0600,继续执行。
VII,搜索是否有活动分区,没有或有多个活动分区,则停止执行。
VIII,将仅有的一个活动分区的第一个扇区的内容(即系统引导代码)覆盖0000:7C00。
IX,再次检查0000:7DFE的内容是否为0XAA55,不等的话,则尝试软盘启动。
X,跳转到0000:7C00,执行系统引导代码。
XI,系统启动。
2,软盘初启:I,通电;
II,BIOS自检。在内存中的自检地址为0FFFF:0000。(注:这个时候还是在实模式下)。自检内容:CPU,主板,内存,硬盘,I/O设备。
III,计算机将软盘中偏移量为0,大小为512B的内容复制到0000:7C00的地址处。
IV,检查0000:7DFE的内容是否为0XAA55。要是不等,则不执行引导代码,死机。
V,跳转到0000:7C00处,执行MBR代码。
VI,系统启动。
恩,现在可以写MBR了,暂时把它命名为boot.asm吧。(啊,忘说了,这里面的汇编一定要用NASM来编译,NASM很好找的,随便搜一下,一大把,用法与MASM基本相同。)
;boot1.asm
;first boot of the two boots ;二次引导中的第一部分
;第二个引导为系统引导
jmp 07c0h:start
;
start:
;设置段寄存器
mov ax,cs
mov ds,ax
mov es,ax
;
;reset the floppy
reset:
mov ax,0
mov dl,0
int 13h
jc reset
;把软盘第一个扇区以后的5个扇区内容读到1000:0000地址中
read:
mov ax,1000h
mov es,ax
mov bx,0
;
mov ah,2
mov al,5
mov ch,0
mov cl,2
mov dh,0
mov dl,0
int 13h
;
jc read
jmp 1000h:0000
times 510-($-$$) db 0 ;保证该段内容(MBR)有512B
dw 0aa55h
编译它
呵呵,一个简单的MBR就成功了。我们先测试一下它。编辑另一个测试程序test.asm如下:
;test
mov ax,cs
mov ds,ax
mov es,ax
mov ah,0eh
mov al,01
mov bl,07
int 10h
hang:
jmp hang
times 510-($-$$) db 0
dw 0aa55h
它的功能是输出一个笑脸^_^
编译它
现在做测试工作:
1, 格式化你的软盘,使之成为引导盘
2, 把你自己写的MBR以及测试程序写入软盘
3, 在bochs下建立floppy文件夹(功能为在bochs软件中模拟软盘启动)
在floppy中加入如下两个文件bochsrc.txt和start.bat
bochsrc.txt中的内容为:
##################################################################
megs: 32
romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000
vgaromimage: $BXSHARE/VGABIOS-elpin-2.40
floppya: 1_44=a:, status=inserted
floppyb: 1_44=a:, status=inserted
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="boot.img", cylinders=306, heads=4, spt=17
boot: a
log: nul
mouse: enabled=1
keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map
####################################################################
start.bat用记事本创建,改下后缀名就行,内容如下:
SET BXSHARE=c:\bochs-2.0
..\bochs
最后“开始”---“运行”----“c:\bochs-2.0\floppy\start.bat”-----“确定”
效果如下:
呵呵,这个引导程序的效果还不赖吧?
OK,今天的事情干完!
2005.11.08