2012-10-23 24 views
5

x86-64 SMP üzerinde çalışan 2.6.32 sürümü için küçük bir linux yüklenebilir çekirdek modülü yazıyorum.Her bir cpu değişkenin adresi

Sorum şu: çekirdekte bildirilen bir cpu değişkeninin adresinin ofsetini elde etmenin bir yolu var mı. Ofset ile gs kaydında bulunan percpu tabanından adresin ofsetini kastediyorum. Özellikle, inanıyorum geçerli görev görev-struct için bir işaretçi olan current_task değişkeninin ofset bulmaya çalışıyorum.

get_current() işlevine sahip olan arch/x86/include/asm/current.h dosyasına bakıyorum. Bu işlev, percpu_read_stable makroyu kullanarak current_task per-cpu değişkenini okur. Bildiğim kadarıyla percpu_read_stable anlayabileceği şekilde temelde böyle bir asm rutinine genişler:

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

Bu kemer/x86/include/asm/percpu.h içindedir. Gs modülden sonra ofseti okumak istiyorum. Eğer per_cpu_current_task değişkeniyle bir printk yapmayı basitleştirirseniz, modül öldürülür.

İlginiz için teşekkür ederiz!

cevap

2

Tamam, bu özel sembolün ofsetini çözdüm. Bu, çekirdek tarafından ihraç edilmektedir. Dolayısıyla Yani offset/proc/kallsyms

000000000000cbc0 D per_cpu__current_task 

bir giriş var bu özel değişken için 0xcbc0 olmasıdır. Tabii ki ofset diğer versiyonlara göre değişir.

İlgili konular