内核模块不可调试之谜 实证 实证:驱动代码所在的物理页面不可写 如何实证? ·得首先找到驱动代码在哪一个物理页面 猜测:一定有信息用于描述一个物理页面可读、 可写属性 思路 弄清线性地址是怎么样转换成物理地址的? 弄清如何描述一个物理页面的属性 思路二: 弄清Linux内核是如何为驱动设置上述机制的?
内核模块不可调试之谜——实证 ◼ 实证:驱动代码所在的物理页面不可写 ◼ 如何实证? ◼ 得首先找到驱动代码在哪一个物理页面 ◼ 猜测:一定有信息用于描述一个物理页面可读、 可写属性 ◼ 思路一: ◼ 弄清线性地址是怎么样转换成物理地址的? ◼ 弄清如何描述一个物理页面的属性 ◼ 思路二: ◼ 弄清Linux内核是如何为驱动设置上述机制的?
实证思路一:弄清页表转换 线性地址转换成物理地址,通常要经过页表 逻辑地址 分段 线性地址 分页 物理地址 线性地址在页表作用下,可转换成物理地址 疑问: .谁执行page walk? 《页表由谁创建? ·谁会设置或修改页表?
实证思路一:弄清页表转换 ◼ 线性地址转换成物理地址,通常要经过页表。 ◼ 线性地址在页表作用下,可转换成物理地址 ◼ 疑问: ◼ 谁执行page walk? ◼ 页表由谁创建? ◼ 谁会设置或修改页表? 逻辑地址 线性地址 分段 分页 物理地址
实证思路 一:弄清页表转换 体系结构制订了页表的规范,内核只是按照 这个规范组织页表等数据结构 程序员手段之阅读技术文档 Volume 3:System Programming Guide Chapter 4 Paging Intel CPU:提供了多种页表结构: 级页表:32位非PAE模式 三级页表:PAE模式 四级页表:IA-32e,即64位模式
实证思路一:弄清页表转换 ◼ 体系结构制订了页表的规范,内核只是按照 这个规范组织页表等数据结构 ◼ 程序员手段之阅读技术文档 ◼ Volume 3: System Programming Guide ◼ Chapter 4 Paging ◼ Intel CPU提供了多种页表结构: ◼ 二级页表:32位非PAE模式 ◼ 三级页表:PAE模式 ◼ 四级页表:IA-32e,即64位模式
32位的页表 Linear Address 31 2221 1211 0 Directory Table Offset 12 4-KByte Page 10 10 Page Table Physical Address Page Directory PTE 20 PDE with PS=0 20 PS=1, CR3 4MB页面
32位的页表 PS=1, 4MB页面
PAE的页表 Linear Address 313029 2120 1211 0 Directory Pointer-> Directory Table Offset 12 4-KByte Page Page Table Physical Address Page Directory 9 9 PTE 40 PDE with PS=0 2 40 PDPTE Registers PS=1, 40 2MB页面 PDPTE value Page Directory Pointer Table
PAE的页表 Page Directory Pointer Table PS=1, 2MB页面