编写设备驱动程序

使用 kmdb 查找系统寄存器

kmdb 调试程序可按组或单独显示计算机寄存器。要按组显示所有寄存器,请按以下示例所示使用 $r


示例 22–11 使用 kmdb 读取 SPARC 处理器中的所有寄存器


[0]: $r

g0    0                                 l0      0
g1    100130a4      debug_enter         l1      edd00028
g2    10411c00      tsbmiss_area+0xe00  l2      10449c90
g3    10442000      ti_statetbl+0x1ba   l3      1b
g4    3000061a004                       l4      10474400     ecc_syndrome_tab+0x80
g5    0                                 l5      3b9aca00
g6    0                                 l6      0
g7    2a10001fd40                       l7      0
o0    0                                 i0      0
o1    c                                 i1      10449e50
o2    20                                i2      0
o3    300006b2d08                       i3      10
o4    0                                 i4      0
o5    0                                 i5      b0
sp    2a10001b451                       fp      2a10001b521
o7    1001311c      debug_enter+0x78    i7      1034bb24     zsa_xsint+0x2c4
y     0
tstate: 1604  (ccr=0x0, asi=0x0, pstate=0x16, cwp=0x4)
pstate: ag:0 ie:1 priv:1 am:0 pef:1 mm:0 tle:0 cle:0 mg:0 ig:0
winreg: cur:4 other:0 clean:7 cansave:1 canrest:5 wstate:14
tba   0x10000000
pc    edd000d8 edd000d8:        ta      %icc,%g0 + 125
npc   edd000dc edd000dc:        nop

调试程序会将每个寄存器值导出到与寄存器同名的一个变量中。如果读取该变量,则返回对应寄存器的当前值。如果写入该变量,则会更改关联的计算机寄存器值。以下示例将一台 x86 计算机上 %o0 寄存器的值由 0 更改为 1。


示例 22–12 使用 kmdb 读/写 x86 计算机中的寄存器


[0]> <eax=K
        c1e6e0f0
[0]> 0>eax
[0]> <eax=K
        0
[0]>  c1e6e0f0>eax

如果需要检查不同处理器的寄存器,则可使用 ::cpuregs dcmd。要检查的处理器的 ID 可以作为 dcmd 的地址或 -c 选项的值来提供,如以下示例所示。


示例 22–13 检查不同处理器的寄存器


[0]> 0::cpuregs
   %cs = 0x0158            %eax = 0xc1e6e0f0 kmdbmod`kaif_dvec
   %ds = 0x0160            %ebx = 0x00000000

以下示例从 SPARC 计算机上的处理器 0 切换到处理器 3。检查了寄存器 %g3,然后将其清除。为确认新值,再次读取 %g3


示例 22–14 从指定的处理器中检索单个寄存器值


[0]> 3::switch
[3]> <g3=K
        24
[3]> 0>g3
[3]> <g3
        0