2011-07-04 8 views
6

के साथ MAP_HUGETLB का उपयोग करने में त्रुटि यह कोड है जिसका उपयोग मैं हुबपेज में ubuntu में फ़ाइल को mmaping के लिए कर रहा हूं, लेकिन यह कॉल त्रुटि "अवैध तर्क" में विफल रही है। हालांकि, जब मैं एमएपी_एएनओएन ध्वज पास करता हूं जिसमें एमएमएपी में कोई फ़ाइल डिस्क्रिप्टर पैरामीटर नहीं होता है, तो यह काम करता है। मैं इसके पीछे संभावित कारण समझने में सक्षम नहीं हूं।उबंटू 10.04, MAP_SHARED

दूसरा, मैं समझ नहीं पा रहा हूं कि एमएपी_PRIVATE के साथ फ़ाइल mmaping क्यों अनुमति है जब यह ध्वज स्वयं का अर्थ है कि फ़ाइल में कोई बदलाव नहीं लिखा जाएगा। यह हमेशा MAP_ANON का उपयोग करके पूरा किया जा सकता है, या क्या मुझे कुछ याद आ रही है?

क्या कोई इनके साथ मेरी सहायता कर सकता है?

int32_t main(int32_t argc, char** argv) { 
int32_t map_length = 16*1024*1024; // 16 MB , huge page size is 2 MB 
int32_t protection = PROT_READ | PROT_WRITE; 
int32_t flags = MAP_SHARED | MAP_HUGETLB; 
int32_t file__ = open("test",O_RDWR|O_CREAT | O_LARGEFILE,s_IRWXU | S_IRGRP | S_IROTH); 
if(file__ < 0) { 
    std::cerr << "Unable to open file\n"; 
    return -1; 
} 

if (ftruncate(file__, map_length) < 0) { 
    std::cerr 
    << "main :: unable to truncate the file\n" 
    << "main :: " << strerror(errno) << "\n" 
    << "main :: error number is " << errno << "\n"; 
    return -1; 
} 
void *addr= mmap(NULL, map_length, protection, flags, file__, 0); 
if (addr == MAP_FAILED) { 
    perror("mmap"); 
    return -1; 
} 
const char* msg = "Hello World\n"; 
int32_t len = strlen(msg); 
memcpy(addr,msg,len); 
munmap(addr, map_length); 
close(file__); 
return 0; 
} 
+0

'int32_t main' एक त्रुटि है। सी ++ मानक के अनुसार, 'मुख्य' का वापसी प्रकार और 'argc' के प्रकार दोनों को केवल' int 'होना चाहिए। –

+0

लार्समैन, क्या यह प्रोग्राम के आउटपुट को प्रभावित करता है? मेरे आर्किटेक्चर int पर int32_t जैसा ही है, इसलिए इससे कोई फर्क नहीं पड़ता। लेकिन मानक दृष्टिकोण से यह सही नहीं है, मैं सहमत हूं। (इससे पहले मैंने इस टिप्पणी को लिखने में कुछ गलती की थी) – Faraz

+0

फराज़: नहीं, वह सिर्फ नाइटपिक कर रहा था। – BjoernD

उत्तर

4

आपके दोनों प्रश्न एक ही बिंदु पर आते हैं: mmap() का उपयोग करके आप दो प्रकार के मैपिंग प्राप्त कर सकते हैं: अनाम स्मृति और फ़ाइलें।

बेनामी मेमोरी (जैसा कि मैन पेज में बताया गया है) फाइल सिस्टम में किसी भी फाइल द्वारा समर्थित नहीं है। इसके बजाय आप एमएपी_एएनओएन कॉल से एमएमएपी() तक वापस आने वाली मेमोरी सादा सिस्टम मेमोरी है। इस इंटरफेस का मुख्य उपयोगकर्ता सी लाइब्रेरी है जो मैलोक/फ्री के लिए बैकिंग स्टोरेज प्राप्त करने के लिए इसका उपयोग करता है। इसलिए, MAP_ANON का उपयोग स्पष्ट रूप से कह रहा है कि आप किसी फ़ाइल को मैप करना नहीं चाहते हैं।

फ़ाइल-समर्थित स्मृति किसी फ़ाइल में (या इसके भाग) में आपके आवेदन के पता स्थान में मिश्रणों की तरह। इस मामले में, स्मृति सामग्री वास्तव में फ़ाइल की सामग्री द्वारा समर्थित है। फ़ाइल के लिए पहली आवंटित स्मृति के रूप में MAP_PRIVATE ध्वज के बारे में सोचें और फिर सामग्री को इस स्मृति में कॉपी करें। सच में यह कर्नेल नहीं कर रहा है, लेकिन चलो बस नाटक करते हैं।

HUGE_TLB एक सुविधा है जो कर्नेल अज्ञात स्मृति के लिए प्रदान करता है (दस्तावेज/vm/hugetlb-page.txt देखें mmap() मैन पेज में संदर्भित)। फ़ाइल के लिए HUGETLB का उपयोग करते समय यह आपके mmap() कॉल विफल होने का कारण होना चाहिए। * संपादित करें: पूरी तरह से सही नहीं है। एक रैम फ़ाइल सिस्टम (hugetlbfs) है जो विशाल पृष्ठों का समर्थन करता है। हालांकि, huge_tlb मैपिंग मनमाने ढंग से फ़ाइलों पर काम नहीं करेगा, क्योंकि मैं दस्तावेज़ों को समझता हूं। *

HUGE_TLB और संबंधित इन-मेमोरी फ़ाइल सिस्टम (hugetlbfs) का उपयोग करने के तरीके के विवरण के लिए, आप निम्न लेखों पर विचार करना चाहेंगे LWN पर:

+0

मैंने लिखा है कि mmap त्रुटि "अमान्य तर्क" में असफल रहा है, यह स्ट्रिंग है जब आप strerno (22) – Faraz

+1

करते हैं तो मैं इस क्वेरी को लिखने से पहले सभी दस्तावेज चला गया और कहीं भी कोई स्पष्टता नहीं है। मुझे "MAP_HUGETLB केवल MAP_ANON के साथ काम करता है" जैसा कुछ पढ़ने में खुशी होगी। दूसरा, hugetlbfs को घुमाने के बाद हम विशाल पृष्ठों (इस एफएस पर) के साथ फ़ाइल समर्थित एमएमएपी कर सकते हैं। यदि वास्तव में MAP_HUGETLB फ़ाइल समर्थित एमएमएपी के लिए समर्थित नहीं है, तो हम उस fs में फ़ाइल समर्थित एमएमएपी के लिए hugepages का उपयोग करने में सक्षम कैसे हैं? ऐसा कुछ होना चाहिए जो गायब है, है ना? – Faraz

+0

मेरा जवाब संपादित किया गया। – BjoernD

0

झंडे मेरे लिए यह तय करने के लिए MAP_PRIVATE जोड़ा जा रहा है।

+0

एमएमएपी पेज का कहना है कि आप केवल MAP_SHARED या MAP_PRIVATE में से एक निर्दिष्ट कर सकते हैं, दोनों नहीं। http://man7.org/linux/man-pages/man2/mmap.2.html –

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

  • कोई संबंधित समस्या नहीं^_^