专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 汇编语言

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

发布时间:2010-06-14 15:39:12 文章来源:www.iduyao.cn 采编人员:星星草
《自己动手写操作系统》中的一个子过程,大家来帮忙解释一下!
在分页的程序中我将原来的新建第二个页目录的逻辑.修改成只是修改原来的页表的对应项,程序没有正常运行.希望大家能帮忙说明一下.

;原逻辑
PSwitch:
;   初始化页目录
mov ax,   SelectorFlatRW
mov es,   ax
mov edi,   PageDirBase1 ;   此段首地址为   PageDirBase1
xor eax,   eax
mov eax,   PageTblBase1   |   PG_P     |   PG_USU   |   PG_RWW
mov ecx,   [PageTableNumber]
.1:
stosd
add eax,   4096 ;   为了简化,   所有页表在内存中是连续的.
loop .1

;   再初始化所有页表
mov eax,   [PageTableNumber] ;   页表个数
mov ebx,   1024 ;   每个页表   1024   个   PTE
mul ebx
mov ecx,   eax ;   PTE个数   =   页表个数   *   1024
mov edi,   PageTblBase1 ;   此段首地址为   PageTblBase1
xor eax,   eax
mov eax,   PG_P     |   PG_USU   |   PG_RWW
.2:
stosd
add eax,   4096 ;   每一页指向   4K   的空间
loop .2

;   在此假设内存是大于   8M   的
mov eax,   LinearAddrDemo
shr eax,   22
mov ebx,   4096
mul ebx
mov ecx,   eax
mov eax,   LinearAddrDemo
shr eax,   12
and eax,   03FFh ;   1111111111b   (10   bits)
mov ebx,   4
mul ebx
add eax,   ecx
add eax,   PageTblBase1
mov dword   [es:eax],   ProcBar   |   PG_P   |   PG_USU   |   PG_RWW

mov eax,   PageDirBase1
mov cr3,   eax
jmp short   .3
.3:
nop

ret

;修改后
PSwitch:
;   初始化页目录
mov ax,   SelectorFlatRW
mov es,   ax

;   在此假设内存是大于   8M   的
mov eax,   LinearAddrDemo
shr eax,   22
mov ebx,   4096
mul ebx
mov ecx,   eax
mov eax,   LinearAddrDemo
shr eax,   12
and eax,   03FFh ;   1111111111b   (10   bits)
mov ebx,   4
mul ebx
add eax,   ecx
add eax,   PageTblBase0
mov dword   [es:eax],   ProcBar   |   PG_P   |   PG_USU   |   PG_RWW

jmp short   .3
.3:
nop

ret

------解决方案--------------------
在我的印象中,能调试保护模式的软件并不多,codeview似乎不行。我推荐:Bochs和TRW2000,它们二位是纯软件调试器,因此可以调试保护模式程序,其实是靠软件来虚拟运行的。Bochs还具有虚拟机的功能。这两个调试器都能够调试保护模式程序。Bochs可以在win98、nt、2000、xp、2003下运行。TRW2000只能够在win98下运行。我用的是Bochs2.2.6,2.2.x颁布的都可以。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: