2012-10-23 8 views
5

मैं x86-64 एसएमपी पर चल रहे संस्करण 2.6.32 के लिए एक छोटा लिनक्स लोड करने योग्य कर्नेल मॉड्यूल लिख रहा हूं।प्रति-सीपीयू चर का पता

मेरा प्रश्न है: कर्नेल में घोषित प्रति-सीपीयू चर के पते की ऑफसेट प्राप्त करने का कोई तरीका है। ऑफ़सेट करके मेरा मतलब है कि percpu बेस से पते का ऑफसेट, जो जीएस रजिस्टर में मिलता है। विशेष रूप से मैं current_task चर के ऑफसेट को खोजने का प्रयास कर रहा हूं, जो कि वर्तमान कार्य के कार्य-कार्य के लिए एक सूचक है।

मैं arch/x86/include/asm/current.h पर देख रहा हूं, जिसमें get_current() फ़ंक्शन है। यह फ़ंक्शन मैक्रो percpu_read_stable का उपयोग कर current_task per-cpu चर को पढ़ता है। जहाँ तक मेरा percpu_read_stable समझ सकते हैं मूल रूप से इस तरह की एक एएसएम दिनचर्या में फैलता है:

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

यह मेहराब/86/शामिल/ASM/percpu.h में है। मैं अपने मॉड्यूल से जीएस के बाद ऑफ़सेट पढ़ना चाहता हूं। अगर मैं per_cpu_current_task चर के साथ एक प्रिंटक सरल करने की कोशिश करता हूं, तो मॉड्यूल मारे गए हैं।

आपके ध्यान के लिए धन्यवाद!

उत्तर

2

ठीक है, मैंने इस विशेष प्रतीक के लिए ऑफ़सेट निकाला। यह कर्नेल द्वारा निर्यात किया जाता है। इसलिए/proc/kallsyms में एक प्रविष्टि है

000000000000cbc0 D per_cpu__current_task 

तो ऑफसेट इस विशेष चर के लिए 0xcbc0 है। बेशक ऑफसेट अन्य संस्करणों के लिए अलग-अलग होगा।

संबंधित मुद्दे