Chinaunix首页 | 论坛 | 博客
  • 博客访问: 115053
  • 博文数量: 23
  • 博客积分: 2092
  • 博客等级: 大尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-10 19:40
文章分类
文章存档

2011年(3)

2010年(17)

2009年(3)

我的朋友

分类:

2010-08-25 18:55:07

段式寻址示意图:

 进入保护模式的主要步骤

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、  Cr0PE位置位。

       ; 打开地址线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]这个节开始的地方,而不是整个程序开始的地方,因此呢,使用上述代码的话,也会出现这个问题的。

明白这个之后呢用UltraEdita.img0X1FE0X1FF510 511 字节)写上(0x55 0xaa) 即(0XAA55 小端格式)。

freedos中运行

解压freedos-img.tar.gz出来后有三个img文件,分别是a.imgb.imgc.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

到这里之后就可以按照书上的进行了。

阅读(2230) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~