2012-10-23 3 views
5

Ich schreibe ein kleines Linux ladbares Kernel-Modul für die Version 2.6.32 läuft auf x86-64 SMP.Adresse der Per-CPU Variable

Meine Frage ist: gibt es eine Möglichkeit, den Offset der Adresse einer pro-CPU-Variable zu erhalten, die im Kernel deklariert wird. Mit Offset meine ich den Offset der Adresse von der Percpubase, die im gs-Register gefunden wird. Ich versuche speziell, den Offset der Variable current_task zu finden, die ein Zeiger auf die Task-Struktur der aktuellen Aufgabe ist, glaube ich.

Ich schaue auf arch/x86/include/asm/current.h, die die Funktion get_current() hat. Diese Funktion liest die Variable current_task per-cpu mit dem Makro percpu_read_stable. Soweit ich im Grunde erweitert in eine asm-Routine wie diese percpu_read_stable verstehen kann:

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

Dies ist in arch/x86/include/asm/percpu.h. Ich möchte den Offset nach gs von meinem Modul lesen. Wenn ich versuche, einfach ein printk mit der Variablen per_cpu_current_task auszuführen, wird das Modul gelöscht.

Vielen Dank für Ihre Aufmerksamkeit!

Antwort

2

Okay, ich habe den Offset für dieses spezielle Symbol herausgefunden. Dieser wird vom Kernel exportiert. Daher gibt es einen Eintrag in/proc/kallsyms

000000000000cbc0 D per_cpu__current_task 

So wird der Versatz 0xcbc0 für diese Variable. Natürlich würde der Offset für andere Versionen variieren.

Verwandte Themen