分类:
2014-02-11 17:41:36
原文地址:一个操作系统的实现笔记二之认识保护模式 作者:飘之叶
段式寻址示意图:
1、初始化 32 位代码段描述符
xor eax, eax
mov ax, cs
shl eax, 4
add eax, LABEL_SEG_CODE32
mov word [LABEL_DESC_CODE32 + 2], ax
shr eax, 16
mov byte [LABEL_DESC_CODE32 + 4], al
mov byte [LABEL_DESC_CODE32 + 7], ah
2准备GDT。
; 为加载 GDTR 作准备
xor eax, eax
mov ax, ds
shl eax, 4
add eax, LABEL_GDT ; eax <- gdt 基地址
mov dword [GdtPtr + 2], eax ; [GdtPtr + 2] <- gdt 基地址
3、 用lgdt加载GDTR。
; 加载 GDTR
lgdt [GdtPtr]
; 关中断
cli
4、 打开A20。
; 打开地址线A20
in al, 92h
or al, 00000010b
out 92h, al
5、 Cr0的PE位置位。
; 打开地址线A20
in al, 92h
or al, 00000010b
out 92h, al
6、 跳转,进入保护模式。
; 准备切换到保护模式
mov eax, cr0
or eax, 1
mov cr0, eax
关于 No bootable disk
自己照着代码敲了一遍,刚开始的时候出现No bootable device ,用光盘里面的提供的a.img也没有问题,一开始以为自己敲得代码有问题,就仔细检查了好久,没发现有什么错误。书上虽然讲了第一个引导扇区是以0XAA55作为结束标识的,可是在这一章的时候,书上没看到哪里有将结束标志写进去。如果用光盘里面提供的源文件去编译的话,后面也是没结束标志的,不知道作者是怎么样写进去的。
如果使用下面代码的话
times 510 - ($ - $$) db 0
dw 0xaa55
因为片pmtest1.asm里面有几个section而在最后面加上上面代码$$是表示[SECTION .s32]这个节开始的地方,而不是整个程序开始的地方,因此呢,使用上述代码的话,也会出现这个问题的。
明白这个之后呢用UltraEdit在a.img的0X1FE和0X1FF(510 和511 字节)写上(0x55 0xaa) 即(0XAA55 小端格式)。
在freedos中运行
解压freedos-img.tar.gz出来后有三个img文件,分别是a.img,b.img,c.img 我们的配置文件需要修改一下,以为使用默认的keymap的时候按冒号键的时候有问题,看freedos给的配置文件没有使用到, 因此就不用keymap了。如下:
megs:32
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
floppya: 1_44=/root/myos/freedos-img/a.img, status=inserted
floppyb: 1_44=pm.img, status=inserted
boot:a
log:bochsout.txt
mouse:enabled=0
keyboard_mapping: enabled=0, map=$BXSHARE/keymaps/x11-pc-de.map
启动之后呢,按照书上说的格式化B。将cp pmtest1.com 如下。因为mnt目录下面没有floppy因此需要创建一个floppy。
# cd chapter3/a/
# ls
bochsout.txt myrc~ pm.inc pmtest1.asm~ pmtest1.com
myrc pm.img pmtest1.asm pmtest1.bin pmtest21.asm~
# mkdir /mnt/floppy
# mount -o loop pm.img /mnt/floppy
# cp pmtest1.com /mnt/floppy/
# umount /mnt/floppy/
# bochs -f myrc
到这里之后就可以按照书上的进行了。