首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

在 Linux x86-32模式下分析内存映射流程(2)

在 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 后的线性地址映射。
继承事业,薪火相传
返回列表