2009-12-16 13 views
7

मेरे पास एक लिनक्स डिवाइस ड्राइवर है जो किसी डिवाइस पर इंटरफेस करता है, सिद्धांत रूप में, 64-बिट पते का उपयोग करके डीएमए कर सकता है। मैं यह देखना चाहता हूं कि यह वास्तव में काम करता है।फोर्स लिनक्स केवल 4 जी से अधिक स्मृति का उपयोग करने के लिए?

क्या कोई आसान तरीका है कि मैं एक लिनक्स मशीन को भौतिक पता 4 जी के नीचे किसी भी स्मृति का उपयोग न करने के लिए मजबूर कर सकता हूं? यह ठीक है अगर कर्नेल छवि कम स्मृति में है; मैं सिर्फ एक ऐसी स्थिति को मजबूर करने में सक्षम होना चाहता हूं जहां मैं अपने सभी गतिशील आवंटित बफर को जानता हूं, और मेरे लिए आवंटित कोई भी कर्नेल या उपयोगकर्ता बफर 32 बिट्स में एड्रेसेबल नहीं हैं। यह एक छोटी सी बलवान शक्ति है, लेकिन मैं जो भी सोच सकता हूं उससे कहीं अधिक व्यापक होगा।

यह मुझे (1) हार्डवेयर को पकड़ने में मदद कर सकता है जो सही ढंग से कॉन्फ़िगर नहीं किया गया था या पूर्ण पते (या केवल सादा टूटा हुआ) के साथ लोड किया गया था (2) बाउंस बफर के आकस्मिक और अनावश्यक उपयोग (क्योंकि वहां कहीं भी नहीं है उछाल)।

स्पष्टीकरण: मैं x86_64 चला रहा हूं, इसलिए मुझे पुराने 32-बिट एड्रेसिंग समस्याओं के बारे में परवाह नहीं है। मैं बस परीक्षण करना चाहता हूं कि एक ड्राइवर 64-बिट भौतिक पते का उपयोग कर बफरों के साथ सही ढंग से इंटरफ़ेस कर सकता है।

उत्तर

7

/usr/src/linux/Documentation/kernel-parameters.txt

  memmap=exactmap [KNL,X86] Enable setting of an exact 
         E820 memory map, as specified by the user. 
         Such memmap=exactmap lines can be constructed based on 
         BIOS output or other requirements. See the [email protected] 
         option description. 

     memmap=nn[KMG]@ss[KMG] 
         [KNL] Force usage of a specific region of memory 
         Region of memory to be used, from ss to ss+nn. 

     memmap=nn[KMG]#ss[KMG] 
         [KNL,ACPI] Mark specific memory as ACPI data. 
         Region of memory to be used, from ss to ss+nn. 

     memmap=nn[KMG]$ss[KMG] 
         [KNL,ACPI] Mark specific memory as reserved. 
         Region of memory to be used, from ss to ss+nn. 
         Example: Exclude memory from 0x18690000-0x1869ffff 
           memmap=64K$0x18690000 
           or 
           memmap=0x10000$0x18690000

आप कर्नेल के बूट पैरामीटर के लिए memmap=4G$0 जोड़ते हैं, तो भौतिक स्मृति की कम 4GB अब पहुंचा जा सकेगा। साथ ही, आपका सिस्टम अब बूट नहीं होगा ... लेकिन कुछ भिन्नता (memmap=3584M$512M?) सिस्टम को बूट करने के लिए 4 जीबी से नीचे पर्याप्त मेमोरी की अनुमति दे सकती है लेकिन पर्याप्त नहीं है कि आपके ड्राइवर के डीएमए बफर आवंटित किए जाएंगे।

+0

ऐसा लगता है कि मुझे जो चाहिए वह बहुत करीब है। दो चेतावनी हैं: पहला, memmap = nn $ ss कर्नेल को स्मृति-मैप किए गए डिवाइस पढ़ने से रोक सकता है, जिसमें पीसीआई/पीसीआई बस पर सबकुछ शामिल है। चारों ओर काम किया जाना चाहिए। दूसरा, मेरे पास बूट पर आवश्यक स्मृति को रोकने का कोई तरीका नहीं है लेकिन फिर डीएमए बफर के रूप में पुनर्नवीनीकरण से मुक्त (जैसे initrd छवि) को मुक्त किया गया है। अभी भी एक उपयोगी उत्तर, धन्यवाद। –

0

आईआईआरसी में पीएई एक्सटेंशन का उपयोग करने के लिए कर्नेल कॉन्फ़िगरेशन के भीतर एक विकल्प है जो आपको 4 जीबी से अधिक का उपयोग करने में सक्षम बनाता है (मैं कर्नेल कॉन्फ़िगरेशन पर थोड़ा सा जंगली हूं - पिछले कर्नेल I recompiled 2.6.4 था - तो कृपया मेरी कमी का बहाना याद)। तुम्हें पता है कि एक कर्नेल config

make clean && make menuconfig

आशा इस मदद करता है, सादर, टॉम को गति प्रदान करने है।

+1

आप गलत समझते हैं; मैं एक सिस्टम को बूट करना चाहता हूं जो _only_ का उपयोग करता है> 4 जीबी मेमोरी। –

+0

@ एरिक Seppanen: माफ़ी माफी! हाँ! मैं निश्चित रूप से गलत समझा। जब मैंने महाकाव्य का जवाब देखा तो मैं दोहरा गया! मैं पूरी तरह से memmap बूट पैरामीटर के बारे में भूल गया था, लेकिन इसका कभी भी उपयोग नहीं किया ... यह आपको एहसास देता है जब आपके पास बहुत सारी स्मृति नहीं है, तो आप उन बूट पैरामीटर का उपयोग करने के लिए परेशान नहीं हैं ... भ्रम के लिए खेद है! :( – t0mm13b

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