方法 3: 使用映射文件

此方法演示了一种使用映射文件 (但不使用 TOC) 访问全局数据的方法。 将计算 民主 /demokext_j 变量的数据的地址。

方法 2 中概述的过程不同: 使用 TOC 和映射文件时,可以随时使用此方法。 此方法需要映射文件以及装入内核扩展时所使用的地址。

注: 由于此方法取决于装入内核扩展的方式,因此如果装入内核扩展的过程发生更改,那么此方法可能会退出工作。

此方法基于以下假设: 可以通过使用以下公式找到全局变量的地址:

Addr of variable = Addr of the last function before the variable in the map +
                   Length of the function +
                   Offset of the variable

以下是 demokext 内核扩展的映射文件的一部分:

20       000005B8 000028  2 GL SD S17   <.fp_write>               glink.s(/usr/lib/glink.o)
21       000005B8           GL LD S18   .fp_write
22       000005E0 000028  2 GL SD S19   <.fp_open>                glink.s(/usr/lib/glink.o)
23       000005E0           GL LD S20   .fp_open
24       00000000 0000F9  3 RW SD S21   <_$STATIC>                demokext.c(demokext.o)
25     E 000000FC 000004  2 RW SD S22   demokext_j                demokext.c(demokext.o)
26   *   00000100 00000C  2 DS SD S23   demokext                  demokext.c(demokext.o)
27       0000010C 000000  2 T0 SD S24   <TOC>
28       0000010C 000004  2 TC SD S25   <_$STATIC>
29       00000110 000004  2 TC SD S26   <_system_configuration>

.text 部分中的最后一个函数位于第 22 行和第 23 行。 此函数与映射的偏移量为 0x000005E0 (第 22 行,第 2 列)。 函数的长度为 0x000028 (第 22 行,第 3 列)。 demokext_j 变量的偏移量为 0x000000FC (第 25 行,第 2 列)。 因此,从装入点值到 demokext_j 变量的偏移量为:

0x000005E0 + 0x000028 + 0x000000FC = 0x00000704

将此偏移量添加到 demokext 内核扩展的装入点值将提供 demokext_j 变量的数据地址。 假定装入点值为 0x01304040,这指示 demokext_j 变量的数据位于:

0x01304040 + 0x00000704 = 0x01304744

要查看全局数据,请完成以下操作:

  1. 激活 KDB 内核调试器。 使用适合您的配置的键序列。 当此步骤完成时,您应该会看到 KDB 提示。
  2. 通过输入以下内容来显示 民主 /demokext_j 变量的数据:
    dw demokext+704

    使用上面列出的过程从地图计算 704 值。 然后将此偏移量添加到 demokext 例程的装入点。 demokext_j 变量的值现在应该是 0x00000065。 所显示的数据应该类似于以下内容:

    demokext_j+000000: 00000065 01304040 01304754 00000000  ...e.0@@.0GT....
    注: 有多种方法可以找到此地址。 有关其他方法,请参阅 设置断点
  3. 通过在命令行上输入 g 并按 Enter 键退出 KDB 内核调试器。 提示更改为美元符号 ($)。
  4. 通过输入fg 并按 Enter 键将演示程序带到前台。 提示将更改为 ./demo
  5. 输入 0 并按 Enter 键以卸载 demokext 内核扩展并退出。