2012-10-23 5 views
5

x86-64 SMP에서 실행중인 2.6.32 버전의 작은 Linux로드 가능한 커널 모듈을 작성 중입니다.cpu 당 변수의 주소

내 질문은 : 커널에 선언 된 CPU 당 변수의 주소 오프셋을 얻는 방법이 있습니까? 오프셋이란 gcp 레지스터에있는 percpu베이스 주소의 오프셋을 의미합니다. 특히 내가 믿는 현재 작업의 task-struct에 대한 포인터 인 current_task 변수의 오프셋을 찾으려고합니다.

나는 get_current() 함수가있는 arch/x86/include/asm/current.h를보고있다. 이 함수는 percpu_read_stable 매크로를 사용하여 cpu 당 current_task 변수를 읽습니다. 지금까지 내가 percpu_read_stable 이해할 수 기본적으로이 같은 ASM 루틴으로 확장

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

이 아치/86/포함/ASM/percpu.h입니다. 내 모듈에서 gs 뒤에 오프셋을 읽고 싶습니다. per_cpu_current_task 변수로 printk를 간단하게 처리하려고하면 모듈이 강제 종료됩니다.

감사합니다.

답변

2

좋아,이 특정 기호에 대한 오프셋을 알아 냈습니다. 이것은 커널에 의해 익스포트됩니다. 이에 따라서, 오프셋은/proc/kallsyms

000000000000cbc0 D per_cpu__current_task 

의 엔트리가 특정 변수 0xcbc0이다. 물론 오프셋은 다른 버전에서도 다를 수 있습니다.