内核动的手脚 弄清楚了地址转换过程,又该如何解惑呢? ·疑惑:分段机制好像被绕开了? 编写汇编程序时,我们需要考虑段,比如代 码段、数据段、栈段等等 说明汇编程序员需要使用CPU提供的地址转换机 制,以完成各种段的设置 在写C、C++程序时,都不需要考虑,谁的功劳? 编译器OR操作系统
内核动的手脚 ◼ 弄清楚了地址转换过程,又该如何解惑呢? ◼ 疑惑:分段机制好像被绕开了? ◼ 编写汇编程序时,我们需要考虑段,比如代 码段、数据段、栈段等等 ◼ 说明汇编程序员需要使用CPU提供的地址转换机 制,以完成各种段的设置 ◼ 在写C、C++程序时,都不需要考虑,谁的功劳? ◼ 编译器 OR 操作系统
内核动的手脚 CPU提供的分段管理机制,谁又是直接使用 者呢? .应用程序OR编译器OR操作系统 GDTR寄存器的特殊之处 不能使用mov指令访问GDTR寄存器 必须使用特殊的sgdt和1gdt指令 sgdt读取GDTR,Igdt写入GDTR 这两个指令是特权指令 分段管理功能的最直接使用者应该是操作系 统
内核动的手脚 ◼ CPU提供的分段管理机制,谁又是直接使用 者呢? ◼ 应用程序 OR 编译器 OR 操作系统 ◼ GDTR寄存器的特殊之处 ◼ 不能使用mov指令访问GDTR寄存器 ◼ 必须使用特殊的sgdt和lgdt指令 ◼ sgdt读取GDTR,lgdt写入GDTR ◼ 这两个指令是特权指令 ◼ 分段管理功能的最直接使用者应该是操作系 统
内核动的手脚 要解开“x86的分段机制好像被绕开了”这 个疑惑,就得探索一下操作系统是如何使用 CPU提供的分段管理机制的 怎么探索? 分段管理机制不外乎涉及到GDTR寄存器、GDT表、 段寄存器 读出这些信息,自然就知道操作系统是如何使 用分段机制的
内核动的手脚 ◼ 要解开“x86的分段机制好像被绕开了”这 个疑惑,就得探索一下操作系统是如何使用 CPU提供的分段管理机制的 ◼ 怎么探索? ◼ 分段管理机制不外乎涉及到GDTR寄存器、GDT表、 段寄存器 ◼ 读出这些信息,自然就知道操作系统是如何使 用分段机制的
内核动的手脚 怎么读取GDT、GDTR、段寄存器? 程序员技术手段之编写内核模块 GDTR寄存器只能在ring Os级别读取 GDT表也是位于内核地址空间,用户态程序不能 读取 因此,需要编写内核模块查看GDTR、GDT的内容
内核动的手脚 ◼ 怎么读取GDT、GDTR、段寄存器? ◼ 程序员技术手段之编写内核模块 ◼ GDTR寄存器只能在ring 0级别读取 ◼ GDT表也是位于内核地址空间,用户态程序不能 读取 ◼ 因此,需要编写内核模块查看GDTR、GDT的内容
内核动的手脚 程序步骤: 编写用户态程序,获取其CS、DS、SS,以弄清 使用的是GDT or LDT,以及index 进入内核,读取GDTR寄存器,获取GDT的基地址 打印出GDT表格的内容,并找出各个段寄存器对 应的表项,即段描述符 分析段描述符内的基地址、段界限等信息 代码3.1(32位)
内核动的手脚 ◼ 程序步骤: ◼ 编写用户态程序,获取其CS、DS、SS,以弄清 使用的是GDT or LDT,以及index ◼ 进入内核,读取GDTR寄存器,获取GDT的基地址 ◼ 打印出GDT表格的内容,并找出各个段寄存器对 应的表项,即段描述符 ◼ 分析段描述符内的基地址、段界限等信息 ◼ 代码3.1(32位)