2011-10-11 15 views
5

मैंने कई प्रोग्राम लिखे हैं और यह पता चला है कि 64 बिट में संकलित होने पर, मेमोरी मैपिंग सेगमेंट (उदाहरण के लिए साझा ऑब्जेक्ट्स और साझा मेमोरी रखी जाती है) है हमेशा 7f9aca84a000-7fff88400000 के आसपास कहीं स्थित है लेकिन बिल्कुल वही नहीं।ELF64/x86_64 और मेमोरी मैपिंग सेगमेंट (साझा ऑब्जेक्ट्स के लिए) का पता शुरू करें

मैं जानना चाहता हूं कि x86_64 आर्किटेक्चर (ईएलएफ 64) पर इस मेमोरी सेगमेंट के लिए एक निश्चित प्रारंभ पता है या इस सेगमेंट के लिए अधिकतम और न्यूनतम सीमा क्या है?

यही कारण है कि मैं इस सवाल से पूछता हूं। हम ट्रू 64 यूनिक्स से लिनक्स तक एक सिस्टम माइग्रेट कर रहे हैं। इस प्रणाली ने आईपीसी एसआईएस वी साझा स्मृति की जटिल फिक्स्ड मेमोरी मैपिंग का इस्तेमाल किया, और यह इस सेगमेंट के अंदर संरचना से दूसरे में जाने के लिए जंजीर सूची का उपयोग कर रहा है। कोड के इस टुकड़े के आकार और जटिलता के साथ, और हमारे पास सीमित समय है, हम शेयर मेमोरी की शुरुआत को ठीक करने के लिए एक मजबूत तरीका खोजने की कोशिश कर रहे हैं (प्रभावी रूप से एक निर्दिष्ट पते के साथ शमत का उपयोग करके जिस पर सेगमेंट संलग्न करना है)। 64 बिट के साथ, वर्चुअल एड्रेस स्पेस इतना विशाल (48 बिट प्रभावी रूप से संभावित पते) है कि "सुरक्षित" निश्चित पता चुनना 32 बिट की तुलना में बहुत आसान और कम जोखिम भरा है।

उत्तर

4

x86-64 मेमोरी मैपिंग लेआउट को arch/x86/mm/mmap.c में परिभाषित किया गया है। जैसा कि आप देख सकते हैं, दो रणनीतियों का उपयोग किया जाता है: टॉप-डाउन और डाउन-अप।

टॉप-डाउन आवंटन डिफ़ॉल्ट है। यह स्टैक की अधिकतम सीमा से नीचे 128 एमबी से शुरू होता है (जैसा कि स्टैक रैलिमिट द्वारा परिभाषित किया गया है), एक यादृच्छिक ऑफसेट द्वारा tweaked, और फिर वहां से स्मृति में नीचे मैपिंग आवंटित करता है।

नीचे-अप आवंटन फ़ॉलबैक है। इसका उपयोग तब किया जाता है जब

  • स्टैक रैलीट असीमित है;
  • प्रक्रिया में ADDR_COMPAT_LAYOUT व्यक्तित्व सेट है; या
  • vm.legacy_va_layout sysctl गैर-शून्य है।

बॉटम-अप आवंटन के तहत, मैप किए गए क्षेत्रों उत्तरोत्तर अधिक पतों आवंटित किए जाते हैं, TASK_SIZE/3 पर शुरू, एक यादृच्छिक ऑफसेट द्वारा फेरबदल। X86-64 पर TASK_SIZE0x800000000000 है, इसलिए नीचे-अप आवंटन 0x2AAAAAAAAAAA पर शुरू होगा।

मैं आपके निश्चित मैपिंग के लिए उपयुक्त छेद का सुझाव दूंगा जो कि आवंटन रणनीति के तहत ठीक होना चाहिए 2 * TASK_SIZE/3 - मैं 0x500000000000 का उपयोग करूंगा।

+0

ऐसी अंतर्दृष्टि के लिए धन्यवाद। मैं आपको बताई गई सारी जानकारी पर चारों ओर देखने जा रहा हूं। – Huygens

+0

तो अपना खुद का प्रारंभिक पता नहीं दे सकता है? – sdkie

3

मेरे पास आपके लिए सीधा जवाब नहीं है (अभी तक!), लेकिन मैं कह सकता हूं कि मुझे उच्च स्मृति श्रेणियों के बाहर मेमोरी सफलतापूर्वक मैपिंग मिली है। उदाहरण के लिए:

#include <stdio.h> 
#include <sys/mman.h> 
#include <stdint.h> 

#define ADDRESS 0x700000000 

int main(int argc, char *argv[]) { 
    uint64_t *map = mmap((void *)ADDRESS, 4096, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); 

    map[0] = 64; 

    printf("Value: %lu\n", map[0]); 

    munmap(map, 4096); 

    return 0; 
} 

मुझे डर है कि मैं समय समय पर गिरी स्रोत के माध्यम से देखने के लिए नहीं है, लेकिन मैं निश्चित रूप से एक नज़र बाद में ले जाएगा। मैंने हमेशा सोचा है कि इस सवाल का जवाब क्या था। । ।

+0

जानकारी के लिए धन्यवाद, सिस्टम वी आईपीसी के साथ कोड में एक समान तकनीक का उपयोग किया जाता है, हमने शमत को कॉल करते समय एक विशेष पता सेट किया है। मैन पेज निकालें देखें: यदि shmaddr नल नहीं है और SHM_RND shmflg में निर्दिष्ट है, तो संलग्नक SHMADR के बराबर पते पर होता है जो SHMLBA के निकटतम एकाधिक तक गोल होता है। अन्यथा shmaddr एक पेज-गठबंधन पता होना चाहिए जिस पर अनुलग्नक होता है। – Huygens

+0

कठिनाई एक उचित पता निर्धारित करना है, जैसा कि आप प्रस्तावित करते हैं: 0x700000000। और हम अपनी पसंद को स्पष्ट रूप से उचित ठहराने में सक्षम होना चाहते हैं। – Huygens

4

क्या एमएमएपीड सेगमेंट के लिए कोई निश्चित प्रारंभ पता है?

नहीं लिनक्स एएसएलआर (पता स्थान लेआउट यादृच्छिकरण) का समर्थन करता है, जिसका अर्थ है कि कार्यक्रमों में पते में यादृच्छिकता का कुछ तत्व होता है। यह कुछ शोषण सफल होने की संभावना कम करने के लिए है। इसके अलावा, शायद कुछ कर्नेल पैच अलग-अलग एएसएलआर रणनीतियों को लागू करते हैं (वे नियमित x86 के लिए करते हैं), पीएक्स, निष्पादन-शील्ड, ...

तो, यदि आप एक निश्चित पते का उपयोग करना चाहते हैं तो आप MAP_FIXED का उपयोग कर सकते हैं , जैसा कि @Ethereal अनुशंसित।