首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

《自己动手写操作系统》中的一个子过程,大家来帮忙解释一下!解决思路

2012-03-02 
《自己动手写操作系统》中的一个子过程,大家来帮忙解释一下!在分页的程序中我将原来的新建第二个页目录的逻

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

;原逻辑
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颁布的都可以。

热点排行