2012-10-23 17 views
5

Sto scrivendo un piccolo modulo kernel caricabile linux per la versione 2.6.32 in esecuzione su SM86 x86-64.Indirizzo della variabile per-cpu

La mia domanda è: c'è un modo per ottenere l'offset dell'indirizzo di una variabile per-cpu dichiarata nel kernel. Per offset intendo l'offset dell'indirizzo dalla base percpu, che si trova nel registro gs. Specificamente sto provando a trovare l'offset della variabile current_task, che è un puntatore alla task-struct del task corrente, credo.

Sto guardando arch/x86/include/asm/current.h, che ha la funzione get_current(). Questa funzione legge la variabile per_campo current_task usando la macro percpu_read_stable. Per quanto posso capire percpu_read_stable espande fondamentalmente in una routine ASM simili:

asm("movq %%gs:%P1, %0" 
    : "=r" (ret__) 
    : "m" (per_cpu__current_task)) 

Ciò è in arch/x86/include/asm/percpu.h. Voglio leggere l'offset dopo gs dal mio modulo. Se provo a fare una semplice stampa con la variabile per_cpu_current_task, il modulo viene ucciso.

Grazie per l'attenzione!

risposta

2

Ok, ho trovato l'offset per questo particolare simbolo. Questo è esportato dal kernel. Quindi v'è una voce in/proc/kallsyms

000000000000cbc0 D per_cpu__current_task 

Così l'offset è 0xcbc0 per questa particolare variabile. Ovviamente l'offset varierebbe per le altre versioni.

Problemi correlati