Subcomando sw
El submandato sw permite que una hebra seleccionada se considere la hebra actual.
Formato
sw [ {de_ranura | dirección_th} | {u | k} ]
Parámetros
| Elemento | Descripción |
|---|---|
| u | Conmuta al espacio de direcciones de usuario para la hebra actual. |
| k | Cambia al espacio de direcciones del kernel para la hebra actual. |
| th_slot | Especifica un número de ranura de hebra. Este parámetro debe ser un valor decimal. |
| th_Address | Especifica la dirección de una ranura de hebra. Se pueden utilizar símbolos, valores hexadecimales o expresiones hexadecimales para especificar la dirección. |
Los distintivos u y k se pueden utilizar para conmutar entre el usuario y el espacio de direcciones de kernel para la hebra actual.
De forma predeterminada, KDB muestra el espacio virtual para la hebra actual. Las hebras se pueden especificar por número de ranura o dirección. La hebra actual se puede restablecer en su contexto inicial especificando el submandato sw sin parámetros. Para el depurador de kernel KDB, el contexto inicial también se restaura siempre que se sale del depurador de kernel de KDB.
Otro
switch
Ejemplos
A continuación se muestra un ejemplo de cómo utilizar el submandato sw :
KDB(0)> sw 12 //switch to thread slot 12
Switch to thread: <thread+000900>
KDB(0)> f //print stack trace
thread+000900 STACK:
[000215FC]e_block_thread+000250 ()
[00021C48]e_sleep_thread+000070 (??, ??, ??)
[000200F4]errread+00009C (??, ??)
[001C89B4]rdevread+000120 (??, ??, ??, ??)
[0023A61C]cdev_rdwr+00009C (??, ??, ??, ??, ??, ??, ??)
[00216324]spec_rdwr+00008C (??, ??, ??, ??, ??, ??, ??, ??)
[001CEA3C]vnop_rdwr+000070 (??, ??, ??, ??, ??, ??, ??, ??)
[001BDB0C]rwuio+0000CC (??, ??, ??, ??, ??, ??, ??, ??)
[001BDF40]rdwr+000184 (??, ??, ??, ??, ??, ??)
[001BDD68]kreadv+000064 (??, ??, ??, ??)
[000037D8].sys_call+000000 ()
[D0046B68]read+000028 (??, ??, ??)
[1000167C]child+000120 ()
[10001A84]main+0000E4 (??, ??)
[1000014C].__start+00004C ()
KDB(0)> dr sr //display segment registers
s0 : 00000000 s1 : 007FFFFF s2 : 00000AB7 s3 : 007FFFFF s4 : 007FFFFF
s5 : 007FFFFF s6 : 007FFFFF s7 : 007FFFFF s8 : 007FFFFF s9 : 007FFFFF
s10 : 007FFFFF s11 : 007FFFFF s12 : 007FFFFF s13 : 6000058B s14 : 00000204
s15 : 60000CBB
KDB(0)> sw u //switch to user context
KDB(0)> dr sr //display segment registers
s0 : 60000000 s1 : 600009B1 s2 : 60000AB7 s3 : 007FFFFF s4 : 007FFFFF
s5 : 007FFFFF s6 : 007FFFFF s7 : 007FFFFF s8 : 007FFFFF s9 : 007FFFFF
s10 : 007FFFFF s11 : 007FFFFF s12 : 007FFFFF s13 : 6000058B s14 : 007FFFFF
s15 : 60000CBB
//Now it is possible to look at user code
//For example, find how read() is called by child()
KDB(0)> dc 1000167C //print child() code (seg 1 is now valid)
1000167C bl <1000A1BC>
KDB(0)> dc 1000A1BC 6 //print child() code
1000A1BC lwz r12,244(toc)
1000A1C0 stw toc,14(stkp)
1000A1C4 lwz r0,0(r12)
1000A1C8 lwz toc,4(r12)
1000A1CC mtctr r0
1000A1D0 bcctr
... //find stack pointer of child() routine with 'set 9; f'
[D0046B68]read+000028 (??, ??, ??)
=======================================================================
2FF22B50: 2FF2 2D70 2000 9910 1000 1680 F00F 3130 /.-p .........10
2FF22B60: F00F 1E80 2000 4C54 0000 0003 0000 4503 .... .LT......E.
2FF22B70: 2FF2 2B88 0000 D030 0000 0000 6000 0000 /.+....0....`...
2FF22B80: 6000 09B1 0000 0000 0000 0002 0000 0002 `...............
=======================================================================
[1000167C]child+000120 ()
...
(0)> dw 2FF22B50+14 1 //- stw toc,14(stkp)
2FF22B64: 20004C54 //toc address
(0)> dw 20004C54+244 1 //- lwz r12,244(toc)
20004E98: F00BF5C4 //function descriptor address
(0)> dw F00BF5C4 2 //- lwz r0,0(r12) - lwz toc,4(r12)
F00BF5C4: D0046B40 F00C1E9C //function descriptor (code and toc)
(0)> dc D0046B40 11 //- bcctr will branch to:
D0046B40 mflr r0
D0046B44 stw r31,FFFFFFFC(stkp)
D0046B48 stw r0,8(stkp)
D0046B4C stwu stkp,FFFFFFB0(stkp)
D0046B50 stw r5,3C(stkp)
D0046B54 stw r4,38(stkp)
D0046B58 stw r3,40(stkp)
D0046B5C addic r4,stkp,38
D0046B60 li r5,1
D0046B64 li r6,0
D0046B68 bl <D00ADC68> //read+000028El ejemplo siguiente muestra algunas de las diferencias entre el kernel y la modalidad de usuario para el proceso de 64 bits:
(0)> sw k //kernel mode
(0)> dr msr //kernel machine status register
msr : 000010B0 bit set: ME IR DR
(0)> dr r1 //kernel stack pointer
r1 : 2FF3B2A0 2FF3B2A0
(0)> f //stack frame (kernel MST)
thread+002A98 STACK:
[00031960]e_block_thread+000224 ()
[00041738]nsleep+000124 (??, ??)
[01CFF0F4]nsleep64_+000058 (0FFFFFFF, F0000001, 00000001, 10003730, 1FFFFEF0, 1FFFFEF8)
[000038B4].sys_call+000000 ()
[80000010000867C]080000010000867C (??, ??, ??, ??)
[80000010001137C]nsleep+000094 (??, ??)
[800000100058204]sleep+000030 (??)
[100000478]main+0000CC (0000000100000001, 00000000200FEB78)
[10000023C]__start+000044 ()
(0)> sw u //user mode
(0)> dr msr //user machine status register
msr : 800000004000D0B0 bit set: EE PR ME IR DR
(0)> dr r1 //user stack pointer
r1 : 0FFFFFFFFFFFFF00 0FFFFFFFFFFFFF00
(0)> f //stack frame (kernel MST extension)
thread+002A98 STACK:
[8000001000581D4]sleep+000000 (0000000000000064 [??])
[100000478]main+0000CC (0000000100000001, 00000000200FEB78)
[10000023C]__start+000044 ()