读书人

《自己动手写操作系统》中的一个子过程

发布时间: 2012-03-02 14:40:28 作者: rapoo

《自己动手写操作系统》中的一个子过程,大家来帮忙解释一下!
在分页的程序中我将原来的新建第二个页目录的逻辑.修改成只是修改原来的页表的对应项,程序没有正常运行.希望大家能帮忙说明一下.

;原逻辑
PSwitch:
; 初始化页目录
movax, SelectorFlatRW
moves, ax
movedi, PageDirBase1; 此段首地址为 PageDirBase1
xoreax, eax
moveax, PageTblBase1 | PG_P | PG_USU | PG_RWW
movecx, [PageTableNumber]
.1:
stosd
addeax, 4096; 为了简化, 所有页表在内存中是连续的.
loop.1

; 再初始化所有页表
moveax, [PageTableNumber]; 页表个数
movebx, 1024; 每个页表 1024 个 PTE
mulebx
movecx, eax; PTE个数 = 页表个数 * 1024
movedi, PageTblBase1; 此段首地址为 PageTblBase1
xoreax, eax
moveax, PG_P | PG_USU | PG_RWW
.2:
stosd
addeax, 4096; 每一页指向 4K 的空间
loop.2

; 在此假设内存是大于 8M 的
moveax, LinearAddrDemo
shreax, 22
movebx, 4096
mulebx
movecx, eax
moveax, LinearAddrDemo
shreax, 12
andeax, 03FFh; 1111111111b (10 bits)
movebx, 4
mulebx
addeax, ecx
addeax, PageTblBase1
movdword [es:eax], ProcBar | PG_P | PG_USU | PG_RWW

moveax, PageDirBase1
movcr3, eax
jmpshort .3
.3:
nop

ret

;修改后
PSwitch:
; 初始化页目录
movax, SelectorFlatRW
moves, ax

; 在此假设内存是大于 8M 的
moveax, LinearAddrDemo
shreax, 22
movebx, 4096
mulebx
movecx, eax
moveax, LinearAddrDemo
shreax, 12
andeax, 03FFh; 1111111111b (10 bits)
movebx, 4
mulebx
addeax, ecx
addeax, PageTblBase0
movdword [es:eax], ProcBar | PG_P | PG_USU | PG_RWW

jmpshort .3
.3:
nop

ret

[解决办法]
在我的印象中,能调试保护模式的软件并不多,codeview似乎不行。我推荐:Bochs和TRW2000,它们二位是纯软件调试器,因此可以调试保护模式程序,其实是靠软件来虚拟运行的。Bochs还具有虚拟机的功能。这两个调试器都能够调试保护模式程序。Bochs可以在win98、nt、2000、xp、2003下运行。TRW2000只能够在win98下运行。我用的是Bochs2.2.6,2.2.x颁布的都可以。

读书人网 >汇编语言

热点推荐