前言
上一篇文章,我们使用C++来简单模拟了分页机制,现在我们来看汇编代码,看看其如何来构建汇编代码的,这里如果新手可能会犯糊涂,很久之前我被这份代码搞晕了好久,现在来一起解释一下。
页表构建代码分析
代码如下,在《x86/x64体系探索及编程》的ex11-2\protected.asm中,来负责初始化页表。
;---------------------------------------------
; init_32bit_paging(): 建立 32-bit paging 环境
;---------------------------------------------
init_32bit_paging:
; 1) 0x000000-0x3fffff 映射到 0x0 page frame, 使用 4M 页面
; 2) 0x400000-0x400fff 映射到 0x400000 page frame 使用 4K 页面
;; PDT 表物理地址设在 0x200000 位置上, PT表物理地址在 0x201000位置上
; 1) 设置 PDT[0](映射 0 page frame)
mov DWORD [PDT32_BASE + 0], 0000h | PS | RW | US | P ; base=0, PS=1, P=1,R/W=1,U/S=1,
; 2) 设置 PDT[1]
; PT表的地址在0x201000位置上,设置为supervisor,only-read 权限
mov DWORD [PDT32_BASE + 1 * 4], 201000h | P ; PT base=0x201000, P=1
; 3) 设置 PT[0](映射0x400000 page frame),设置为supervisor,only-read 权限
mov DWORD [201000h + 0], 400000h | P ; page frame在0x400000, P=1
ret
注意,在运行这段代码时,其并没有开启保护模式,因此此时上述代码中出现的地址是物理地址。我们拿0x400000举例,其这段代码的含义是将"线性地址0x400000的虚拟页映射到物理地址0x400000"中。
我们必须要将线性地址0x400000拆分,按照我们上述的代码其拆分为 1-0-0,因此就要将其放在PDE页表偏移1处( [PDT32_BASE + 1 * 4]),PTE页表偏移零处([201000h + 0]),在PTE页表中填入要被线性地址0x400000映射的物理页。
注意,此时填写的0x400000是物理地址,当然我们填写其余的物理地址也好。
设置寄存器代码解读
首先将我们构建好的页表放入cr3中,代码如下,很好理解。
mov eax, PDT32_BASE
mov cr3, eax
下面是开启大页模式的寄存器设置,代码很简单,CR4.PSE位置为1即可,但是在开启前必须先通过cpuid来查询一下当前cpu是否支持大页模式。
pse_enable:
mov eax, 1
cpuid
bt edx, 3 ; PSE support?
jnc pse_enable_done
mov eax, cr4
bts eax, 4 ; CR4.PSE = 1
mov cr4, eax
pse_enable_done:
ret
之后才是真正开启分页模式,这分页模式开启比较简单,直接使用mov指令开启paging模式,之后会通过页表来寻址,这个过程由cpu负责,没有os代码来解析代码。
; 打开 paging
mov eax, cr0
bts eax, 31
mov cr0, eax
之后使用bochs运行的代码如下,这里面显示

总结
我们这篇文章就是简单介绍了一下其构建页表开启分页模式的代码,一定要记住,在开启分页模式前,我们是访问的物理地址,其构建逻辑一定要清晰。
补充上一个shell脚本
之后要一直不断编译汇编代码,用命令行太麻烦了,但是在Windows环境下脚本语法没有掌握,最后用cgywin工具模拟Linux环境,编写了shell脚本,可以自动完成编译与构建,之后连同代码一起发布到github上。
#!/bin/bash
if [ $# != 1 ]; then
echo "example: .\x86code.sh 11-2"
fi
cd 'source/topic'${1:0:2}
echo "@1 now enter:" $(pwd)
echo "@2 compile protected.asm"
../../tools/nasm/nasm.exe -I../ 'ex'${1}'/protected.asm' -o 'ex'${1}'/protected'
cd 'ex'${1}
echo "@3 now enter:" $(pwd)
echo "@4 write into c.img"
../../../tools/merge.exe
1019




被折叠的 条评论
为什么被折叠?



