2012-06-09 19 views
7

में पता मेरे पास एक प्रश्न है जब मैं कर्नेल में पता लगाता हूं। मैं कर्नेल में एक नमस्ते मॉड्यूल डालें, इस मॉड्यूल में, मैं इन बातों को रख:कर्नेल

char mystring[]="this is my address"; 
printk("<1>The address of mystring is %p",virt_to_phys(mystring)); 

मुझे लगता है मैं mystring का भौतिक पता प्राप्त कर सकते हैं, लेकिन मैं यह है क्या मिला, syslog में, इसके बारे में मुद्रित पता है 0x38dd0000। हालांकि, मैंने स्मृति को छोड़ दिया और पाया कि इसका असली पता डीसीडी 2 ए000 है, जो कि पहले से काफी अलग है। इसे कैसे समझाओ? मैने कुछ गलत किया है? धन्यवाद

पीएस: मैंने पूरी मेमोरी, भौतिक पते को डंप करने के लिए एक टूल का उपयोग किया।

+0

जब आप, आप वर्चुअल पतों वहाँ नहीं मिला "स्मृति फेंक दिया?" –

+0

जिस स्मृति को मैंने छोड़ा था वह भौतिक पता है, मैंने एक उपकरण का उपयोग किया – Alex

+2

हार्डवेयर प्लेटफॉर्म क्या है? – shodanex

उत्तर

7

Man page of VIRT_TO_PHYS

लौटे भौतिक पता के अनुसार दिए गए स्मृति पते के लिए शारीरिक (CPU) मानचित्रण है। यह इस फ़ंक्शन का उपयोग सीधे मैप किए गए पते पर या kmalloc के माध्यम से आवंटित करने के लिए मान्य है।

यह फ़ंक्शन डीएमए स्थानान्तरण के लिए बस मैपिंग नहीं देता है। लगभग सभी बोधगम्य मामलों में एक डिवाइस ड्राइवर इस फ़ंक्शन का उपयोग नहीं किया जाना चाहिए

mystring के लिए स्मृति आवंटन kmalloc पहले उपयोग करने का प्रयास;

char *mystring = kmalloc(19, GFP_KERNEL); 
strcpy(mystring, "this is my address"); //use kernel implementation of strcpy 
printk("<1>The address of mystring is %p", virt_to_phys(mystring)); 
kfree(mystring); 

यहाँ strcpy के एक कार्यान्वयन पाया here है:

char *strcpy(char *dest, const char *src) 
{ 
    char *tmp = dest; 

    while ((*dest++ = *src++) != '\0') 
      /* nothing */; 
    return tmp; 
} 
+0

मैंने इस तरह प्रयोग किया लेकिन त्रुटियां हैं, पहले kmalloc में दो तर्क होना चाहिए, इसलिए मैंने GEL_KERNEL जोड़ा, दूसरा स्ट्रैपी लाइन में है, मुझे लगता है कि 'strcpy' स्वीकार नहीं किया गया है ... तो मैं इसे कैसे हल कर सकता हूं, धन्यवाद – Alex

+1

हाहा, वाह! क्षमा करें, क्योंकि मैंने कर्नेल को छुआ है, लगभग 6 महीने हो गए हैं। जहां तक ​​strcpy चला जाता है, यदि आपका कर्नेल स्रोत एक प्रदान करता है, तो आपको #'शामिल करना चाहिए। या आप अपना खुद का लिख ​​सकते हैं। – Anthony

+0

धन्यवाद! बहुत कुछ! लेकिन जब मैं इसे बना देता हूं, तो दो त्रुटियां भी होती हैं, एक 'char * mystring = kmalloc (19, GFP_KERNEL) है;' त्रुटि है 'प्रारंभकर्ता तत्व स्थिर नहीं है', दूसरा 'strcpy (mystring, "यह मेरा पता है") है; 'कमांड, त्रुटि' अपेक्षित 'है)' स्ट्रिंग स्थिर होने से पहले 'मैंने पहले ही लिखा है कि स्ट्रैपी फ़ंक्शन जोड़ा गया है, धन्यवाद !! – Alex