方法 2: 使用 TOC 和映射文件

方法 2 演示了使用 TOC 和映射文件访问全局数据。 此方法要求在要调试的内核扩展过程中,在 KDB 内核调试器中停止系统。 将计算 民主 /demokext_j 变量的数据的地址。

在您使用 TOC 和映射文件的地址找到全局数据的地址之前,必须在 KDB 内核调试器中您要调试的内核扩展的例程内停止系统。 要执行此操作,请在内核扩展中设置断点。 有关设置断点的更多信息,请参阅 设置断点

当调用 KDB 内核调试器时,通用寄存器 2 号指向 TOC 的地址。 从映射文件中,可以计算从目录表 (TOC) 开始到期望 TOC 条目的偏移量。 如果知道此偏移量,并且知道 TOC 的起始地址,那么将允许计算所需全局变量的 TOC 条目的地址。 然后,可以检查所需变量的 TOC 条目的地址,以确定数据的地址。

例如,假定由于 demokext 例程第 67 行的断点而调用了 KDB 内核调试器,并且通用寄存器号 2 的值为 0x01304754

要查找 民主 /demokext_j 变量的地址,请完成以下操作:

  1. 计算从 TOC 开始到 demokext_j 变量的 TOC 条目的偏移量。 从映射文件中, TOC 从 0x0000010C 开始, demokext_j 变量的 TOC 条目位于 0x00000114。 因此,从 TOC 开始到相关条目的偏移量为:
    0x00000114 - 0x0000010C = 0x00000008
  2. 计算 民主 /demokext_j 变量的 TOC 项的地址。 这是通用寄存器 2 的当前值加上前一步骤中计算的偏移量。 该计算方法如下:
    0x01304754 + 0x00000008 = 0x0130475C
  3. 0x0130475C上显示数据。 显示的数据是 demokext_j的数据的地址。

要查看和修改全局数据,请执行以下操作:

  1. KDB(0) 提示符处,通过输入以下命令在 demokext 例程的第 67 行设置中断:
    b demokext+e0
    注: 在此位置中断可确保在 demokext 例程中调用 KDB 内核调试器。
  2. 获取 "通用 2 2" 的值。 您需要该地址来确定 TOC 的地址。
  3. 通过在命令行上输入 g 来退出 KDB 内核调试器。
  4. 将演示程序带到前台,然后选择一个选项。 选择选项将导致调用 demokext 例程以进行配置。 因为设置了中断,所以这会导致调用 KDB 内核调试器。
    注: 提示更改为美元符号 ($)。
  5. 通过输入以下内容将演示程序引入到前台:
    fg
    注: 提示更改为 ./demo
  6. 输入值 1 以选择用于增加 demokext 内核扩展中的计数器的选项。 这将导致 demokext 内核扩展的第 67 行出现中断,并且提示将更改为 KDB(0)
  7. 通过输入以下内容来显示通用寄存器:
    dr
    所显示的数据应该类似于以下内容:
    r0  : 0130411C  r1  : 2FF3B210  r2  : 01304754  r3  : 01304744  r4  : 0047B180
    r5  : 0047B230  r6  : 000005FB  r7  : 000DD300  r8  : 000005FB  r9  : 000DD300
    r10 : 00000000  r11 : 00000000  r12 : 013042F4  r13 : DEADBEEF  r14 : 00000001
    r15 : 2FF22D80  r16 : 2FF22D88  r17 : 00000000  r18 : DEADBEEF  r19 : DEADBEEF
    r20 : DEADBEEF  r21 : DEADBEEF  r22 : DEADBEEF  r23 : DEADBEEF  r24 : 2FF3B6E0
    r25 : 2FF3B400  r26 : 10000574  r27 : 22222484  r28 : E3001E30  r29 : E6001800
    r30 : 01304744  r31 : 01304648
    使用映射,从 TOC 开头到 demokext_j 变量的 TOC 条目的偏移量为 0x00000008。 将此偏移量添加到为 r2 显示的值指示感兴趣的 TOC 条目位于: 0x0130475C
    注: 可以使用 KDB 内核调试器来执行添加操作。 在这种情况下,要使用的子命令为 hcal @r2+8。 有关 hcal 子命令的更多信息,请参阅 hcal 和 dcal 子命令
  8. 通过输入以下内容来显示 民主 /demokext_j 变量的 TOC 条目:
    dw 0130475C
    此条目包含 民主 /demokext_j 变量的数据的地址。 所显示的数据应该类似于以下内容:
    TOC+000008: 01304744 000BCB34 00242E94 001E0518  .0GD...4.$......
    显示的第一个字的值是 民主 /demokext_j 变量的数据的地址。
  9. 通过输入以下内容来显示 民主 /demokext_j 变量的数据:
    dw 01304744
    所显示的数据应该指示 民主 /demokext_j 变量的值仍为 0x0000064。 这是先前设置的,因为在递增 demokext_j 变量之前,断点集在 demokext 例程中。 所显示的数据应该类似于以下内容:
    demokext_j+000000: 00000064 01304040 01304754 00000000  ...d.0@@.0GT....
  10. 使用以下命令清除所有断点:
    ca
  11. 通过在命令行上输入 g 来退出内核调试器。
    注: 当您退出时,演示程序位于前台,并会显示下一个选项的提示。 内核扩展将运行 民主 /demokext_j 变量并使其递增。 下次应该具有值 0x00000065
  12. 输入 Ctrl + Z 键序列可停止演示程序。 此时,提示将更改为美元符号 ($)。
  13. 通过输入以下内容将演示程序放置在后台:
    bg