第四讲内核模块不可调试之谜 李林 电子科技大学计算机学院
第四讲 内核模块不可调试之谜 李 林 电子科技大学 计算机学院
内核模块不可调试之谜 问题 练习程序员手段之调试驱动程序 调试内核版本3.13.0中的驱动程序(代码 4.1) 问题 停在断点之后,不能继续往下运行了 可能是什么原因?
内核模块不可调试之谜——问题 ◼ 练习程序员手段之调试驱动程序 ◼ 调试内核版本3.13.0中的驱动程序(代码 4.1) ◼ 问题: ◼ 停在断点之后,不能继续往下运行了 ◼ 可能是什么原因?
内核模块不可调试之谜 问题 利用反汇编手段,分析问题 再次调试程序,并反汇编发现: 0xffffffffa0272235 mov %cr3,%rax Oxffffffffa0272238 : mov %rax,-0x8(%rbp) Oxffffffffa027223c : int3 Oxffffffffa027223d : out %eax,(%dx) Oxffffffffa027223e : std Oxffffffffa027223f : (bad) Oxffffffffa0272240 dec %ecx Oxffffffffa0272242 : retq 什么是int3(trap)? 为什么会有int3(机器码0xcc)?能想到 什么?
内核模块不可调试之谜——问题 ◼ 利用反汇编手段,分析问题 ◼ 再次调试程序,并反汇编发现: ◼ 什么是int 3(trap)? ◼ 为什么会有int 3(机器码0xcc)?能想到 什么?
内核模块不可调试之谜 问题 调试器的基本原理 设置断点并continue后,调试器会将断点处的 内存修改为0xcC 运行到断点处后,相当于执行int3的处理函数, 即调试器的主要工作环境 ·同时,调试器会将断点处的0xcc修改为原值 kgdb不能往下执行的原因:在于没有将Oxcc 改回原值 问题来了:为什么没有改回原值?
内核模块不可调试之谜——问题 ◼ 调试器的基本原理 ◼ 设置断点并continue后,调试器会将断点处的 内存修改为0xcc ◼ 运行到断点处后,相当于执行int 3的处理函数, 即调试器的主要工作环境 ◼ 同时,调试器会将断点处的0xcc修改为原值 ◼ kgdb不能往下执行的原因:在于没有将0xcc 改回原值 ◼ 问题来了:为什么没有改回原值?
内核模块不可调试之谜 猜想 为什么没有改回原值? 代码有bug 代码忘写了 会不会驱动代码所在的物理页面不可写?
内核模块不可调试之谜——猜想 ◼ 为什么没有改回原值? ◼ 代码有bug ◼ 代码忘写了 ◼ …………… ◼ 会不会驱动代码所在的物理页面不可写?
内核模块不可调试之谜 实证 实证:驱动代码所在的物理页面不可写 如何实证? ·得首先找到驱动代码在哪一个物理页面 猜测:一定有信息用于描述一个物理页面可读、 可写属性 思路 弄清线性地址是怎么样转换成物理地址的? 弄清如何描述一个物理页面的属性 思路二: 弄清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页面