यह प्रश्न काफी लंबा है, इसलिए मैं शीर्ष पर प्रश्न पूछूंगा और फिर प्रश्नों पर आने की मेरी विधि के माध्यम से जाऊंगा:
- क्या (बिजीबॉक्स आधारित) rm निष्पादित नहीं हुआ क्योंकि पर्याप्त सन्निहित रैम नहीं था?
- यदि हां, तो क्या डीएमए को डीफ़्रैग्मेट करने का एक हल्का तरीका है - सिस्टम रीस्टार्ट का सहारा लिए बिना?
- यदि नहीं, तो इसका क्या कारण है? मैं इसे भविष्य में होने से कैसे रोक सकता हूं?
हमारी परीक्षा प्रणाली पिछले कुछ दिनों से काफी गहन रूप से चल रही थी - मैंने सिस्टम में टेलनेट किया और परीक्षा परिणामों की जाँच की। जब मैं कुछ डेटा को हटाने के लिए आया था, तो सिस्टम ने कमांड लाइन लौटा दी (जैसे कि कमांड ने सही तरीके से निष्पादित किया था)। जब मैं परिणाम के एक और सेट के लिए निर्देशिका की जांच करने के लिए आया, तो मैंने देखा कि फ़ाइल अभी भी अस्तित्व में है (एलएस का उपयोग करके)।
इसके बाद, मैंने अपने शेल कमांड के अधिक से अधिक ध्यान दिया और उम्मीद के मुताबिक प्रदर्शन नहीं किया।
मैं सही से निष्पादित करने में विफल होने के बाद dmesg से एक आउटपुट के साथ शुरू करूँगा :
प्रक्रिया 6821 (आरएम) से लंबाई 61440 का आवंटन विफल रहा
डीएमए प्रति-सीपीयू:
CPU 0: hi: 0, btch: 1 usd: 0
एक्टिव_नॉन: 0 सक्रिय_फाइल: 1 निष्क्रिय_ऑन: 0 निष्क्रिय_फाइल: 0 अपरिहार्य: 6 गंदा: 0 लेखन: 0 अस्थिर: 0 मुक्त: 821 स्लैब: 353 मैप किए गए: 0 पेजेबल्स: 0 उछाल: 0
डीएमए मुक्त: 3284kB मिनट: 360kB कम: 448kB उच्च: 540kB सक्रिय_नोन: 0kB निष्क्रिय_करण: 0kB सक्रिय_फाइल: 4kB निष्क्रिय_फाइल: 0kB निष्क्रिय: 24kB वर्तमान: 8128kB Pages_scanned: 0 all_unreclaimable नहीं
lowmem_reserve []: ० ० ०
डीएमए: 31 * 4kB 47 * 8kB 42 * 16kB 64 * 32kB 1 * 64kB 0 * 128kB 0 * 256kB 0 * 512kB 0 * 1024kB 0 * 2048kB 0 * 4096kB = 3284kB
14 कुल पृष्ठ पृष्ठ
प्रक्रिया डेटा के लिए रैम आवंटित करने में असमर्थ, 12 तक गलत नहीं है
प्रारंभ में, मुझे लगा कि मैं सन्निहित स्मृति के सबसे बड़े हिस्से में कार्यक्रम चलाने में असमर्थ था। मतलब डीएमए बहुत अधिक खंडित था और मुझे मेमोरी को डीफ़्रैग्मेन्ट करने के लिए सिस्टम प्राप्त करने का एक तरीका खोजना होगा।
फिर मैंने एक त्वरित गणित / पवित्रता जांच की और महसूस किया कि कार्यक्रम को एकमात्र 64kB सन्निहित मेमोरी स्लॉट में चलाने में सक्षम होना चाहिए। आरएम 61440 बाइट्स (60kB) का अनुरोध कर रहा था।
मैंने एक अच्छा पुराना "मैनुअल डिफ्रैग" किया और सिस्टम को रिबूट किया। जब मैंने sytem I को रिबूट किया / आउटपुट / procinfo:
Node 0, zone DMA 2 8 3 12 0 1 0 1 0 1 0
जिस पर मुझे शक है:
- 2 x 4 केबी
- 8 x 8 केबी
- 3 x 16 kB
- 12 x 32 kB
- 1 एक्स 128 केबी
- 1 एक्स 512 केबी
लेकिन अगर कोई उपरोक्त मानों की सूची पर हस्ताक्षर करता है, तो यह / proc / meminfo के आउटपुट के साथ मेल नहीं खाता है :
MemTotal: 6580 kB
MemFree: 3164 kB
Buffers: 0 kB
Cached: 728 kB
SwapCached: 0 kB
Active: 176 kB
Inactive: 524 kB
Active(anon): 0 kB
Inactive(anon): 0 kB
Active(file): 176 kB
Inactive(file): 524 kB`
Unevictable: 0 kB
Mlocked: 0 kB
MmapCopy: 844 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 0 kB
Mapped: 0 kB
Slab: 1268 kB
SReclaimable: 196 kB
SUnreclaim: 1072 kB
PageTables: 0 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 3288 kB
Committed_AS: 0 kB
VmallocTotal: 0 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
पुनरावृत्ति करने के लिए, मेरे प्रश्न हैं:
- क्या rm ने निष्पादित नहीं किया क्योंकि पर्याप्त सन्निहित रैम नहीं थी?
- यदि हां, तो क्या डीएमए को डीफ़्रैग्मेट करने का एक हल्का तरीका है - सिस्टम रीस्टार्ट का सहारा लिए बिना?
- यदि नहीं, तो इसका क्या कारण है? मैं इसे भविष्य में होने से कैसे रोक सकता हूं?
मैं Lantronix के XPort Pro (8MB, Linux OS) का उपयोग कर रहा हूं जो कि uClinux संस्करण 2.6.30 चला रहा है। उपयोग में शेल हश है।