मेरी सी ++ प्रोग्राम (Windows पर) में, मैं स्मृति का एक ब्लॉक का आवंटन कर रहा हूँ और यकीन है कि यह भौतिक स्मृति में लॉक रहता है (unswapped और सन्निहित) (यानी VirtualAllocEx(), MapUserPhysicalPages() का उपयोग कर सकते हैं आदि)।
नहीं है, तुम सच में सुनिश्चित नहीं कर सकते कि यह लॉक रहे। क्या होगा यदि आपकी प्रक्रिया दुर्घटनाग्रस्त हो जाती है, या जल्दी निकलती है? क्या होगा यदि उपयोगकर्ता इसे मारता है? यही कारण है कि स्मृति के लिए कुछ और दोबारा इस्तेमाल किया जाएगा, और यदि आपका डिवाइस अभी भी डीएमए कर रहा है, है कि अंततः डेटा हानि/भ्रष्टाचार या किसी बग जाँच (बीएसओडी) का परिणाम देगा।
इसके अलावा, MapUserPhysicalPages
विंडोज एडब्ल्यूई (पता विंडिंग एक्सटेंशन) का हिस्सा है, जो विंडोज सर्वर के 32-बिट संस्करणों पर 4 जीबी से अधिक रैम को संभालने के लिए है। मुझे नहीं लगता कि इसका उद्देश्य उपयोगकर्ता-मोड डीएमए को हैक करने के लिए किया जाना था।
1. क्या कोई तरीका है कि मैं वर्चुअल एड्रेस को अपने प्रोग्राम में भौतिक एक में उपयोगकर्ता मोड में अनुवाद कर सकता हूं?
ऐसे ड्राइवर हैं जो आपको ऐसा करने देते हैं, लेकिन आप विंडोज़ पर उपयोगकर्ता मोड से डीएमए प्रोग्राम नहीं कर सकते हैं और अभी भी एक स्थिर और सुरक्षित प्रणाली है। एक सीमित उपयोगकर्ता खाते के रूप में चलने वाली प्रक्रिया को पढ़ने/लिखने के लिए भौतिक स्मृति को उस प्रक्रिया को सिस्टम के स्वामित्व की अनुमति मिलती है। यदि यह एक-ऑफ सिस्टम या प्रोटोटाइप के लिए है, तो यह संभवतः स्वीकार्य है, लेकिन यदि आप अपने सॉफ़्टवेयर और आपके डिवाइस का उपयोग करने के लिए अन्य लोगों (विशेष रूप से भुगतान करने वाले ग्राहकों) की अपेक्षा करते हैं, तो आपको ड्राइवर लिखना चाहिए।
2. यदि नहीं, तो मैं इस वर्चुअल को केवल केरल मोड में भौतिक मानचित्रण के बारे में पता लगा सकता हूं। मुझे लगता है कि इसका मतलब है कि मुझे ऐसा करने के लिए एक ड्राइवर लिखना है ...?
इस समस्या से संपर्क करने का यह अनुशंसित तरीका है।
क्या आप किसी भी आसानी से उपलब्ध ड्राइवर/डीएलएल/एपीआई के बारे में जानते हैं जिसका मैं उपयोग कर सकता हूं, कि मेरा एप्लिकेशन (प्रोग्राम) अनुवाद करने के लिए इंटरफ़ेस करेगा?
आप उपयोगकर्ता-मोड प्रक्रिया के स्वामित्व वाले मेमोरी बफर समेत मनमाने ढंग से स्मृति को लॉक करने के लिए MDL (Memory Descriptor List) का उपयोग कर सकते हैं और इसके आभासी पते को भौतिक पते में अनुवाद कर सकते हैं। METHOD_IN_DIRECT
या METHOD_OUT_DIRECT
का उपयोग कर आप DeviceIoControl
पर कॉल में पारित बफर के लिए अस्थायी रूप से एक एमडीएल बना सकते हैं।
ध्यान दें कि आभासी पता स्थान में संगत पृष्ठ भौतिक पता स्थान में लगभग कभी भी संगत नहीं होते हैं। उम्मीद है कि आपका डिवाइस इसे संभालने के लिए डिज़ाइन किया गया है।
3. अगर मुझे ड्राइवर को खुद लिखना पड़ेगा, तो मैं यह अनुवाद कैसे करूं? मैं किस काम का उपयोग करता हूं? क्या यह mmGetPhysicalAddress() है? मैं इसे कैसे इस्तेमाल करूं?
कुछ एपीआई को कॉल करने से ड्राइवर को लिखने के लिए बहुत कुछ है। यदि आप एक ड्राइवर लिखने जा रहे हैं, तो मैं MSDN और OSR से जितनी प्रासंगिक सामग्री पढ़ सकता हूं उसे पढ़ने की सलाह दूंगा। इसके अलावा, Windows Driver Kit में उदाहरण देखें।
4. इसके अलावा, अगर मैं सही ढंग से समझता हूं, तो mmGetPhysicalAddress() कॉलिंग प्रक्रिया के संदर्भ में वर्चुअल बेस पते का भौतिक पता देता है। लेकिन अगर कॉलिंग प्रक्रिया ड्राइवर है, और मैं उस फ़ंक्शन के लिए ड्राइवर को कॉल करने के लिए अपने एप्लिकेशन का उपयोग कर रहा हूं, तो मैं संदर्भ बदल रहा हूं और जब मैं mmGetPhysicalAddress routine कहलाता हूं तो मैं ऐप के संदर्भ में नहीं हूं ... इसलिए मैं एप्लिकेशन (उपयोगकर्ता-मोड) मेमोरी स्पेस में वर्चुअल एड्रेस का अनुवाद कैसे करूं, ड्राइवर नहीं?
ड्राइवर्स प्रक्रिया नहीं हैं। एक ड्राइवर किसी भी प्रक्रिया के संदर्भ में, साथ ही विभिन्न उन्नत संदर्भ (हस्तक्षेप हैंडलर और डीपीसी) के संदर्भ में चला सकता है।
मैं उत्सुक हूँ, क्या एक बाह्य उपकरण एक भौतिक स्मृति पते के साथ कर सकता है? – jyoung
विवरण में जाकर, यह एक ऑनबोर्ड डिवाइस है जिसकी मशीन की रैम तक सीधी पहुंच है, लेकिन ओएस मैपिंग से अनजान है (यही कारण है कि वर्चुअल एड्रेस या साझा मेमोरी ऑब्जेक्ट का उपयोग नहीं करेगा)। –