Board logo

标题: 在 Linux x86-32模式下分析内存映射流程(2) [打印本页]

作者: yuyang911220    时间: 2015-7-30 19:00     标题: 在 Linux x86-32模式下分析内存映射流程(2)

name值base0x00000000limit0xfffffG1可以看出段基址是 0x00000000, G和limit决定了该段是 4G 大小。所以从逻辑地址获得变量 a 的线性地址如下:
0x0804A044 + 0x00000000 = 0x0804A044;
分页机制因为 CR4.PAE = 1,说明系统开启了 PAE(物理地址扩展). PAE 模式下的分页有如下 2 种。


寄存器及 entry 格式如下:

此时 CR3 中的基址就是 PDPTE 的基址 0x1EF49000, 变量 a 线性地址的bit 31-30 代表了 PDPTE 的序号。 我们可以算出 使用的 PDPTE 地址:
0x1EF49000 + 0 * 8 = 0x1EF49000

可以看到 page directory 的基址为 0x1ec9f000, 使用线性地址中的 bits 29~ 21 来确定偏移为 0x40, 所以使用的 PDE 地址为
0x1EC9F000 + 0x40 * 8 = 0x1EC9F200

PDE 为 0x0000000020A36067, bit7 = 0,说明指向的是 page table, page table 地址为0x20A36000, 使用线性地址的 bits 20~12 作为偏移为 0x4A, 使用的 PTE 地址为
0x20A36000 + 0x4A * 8 = 0x20A36250

PTE 为 0x000000000B628067, 得到了最终的 4K page frame 基址为 0x0B628000, 使用线性地址的 bits 11~0 作为偏移为 0x44, 我们计算出的 变量 a 的物理地址为
0x0B628000 + 0x44 = 0x0B628044

我们看到了数据 0x013579BB, 说明我们正确找到了 a 的物理地址,反向验证了 linux 在 x86-32 模式下开启了 PAE 后的线性地址映射。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0