《自己动手写操作系统》中的一个子过程,大家来帮忙解释一下!解决思路
《自己动手写操作系统》中的一个子过程,大家来帮忙解释一下!
在分页的程序中我将原来的新建第二个页目录的逻辑.修改成只是修改原来的页表的对应项,程序没有正常运行.希望大家能帮忙说明一下.
;原逻辑
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颁布的都可以。
在分页的程序中我将原来的新建第二个页目录的逻辑.修改成只是修改原来的页表的对应项,程序没有正常运行.希望大家能帮忙说明一下.
;原逻辑
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颁布的都可以。