2011-10-26 15 views
6

का अनुकरण कैसे करें मेरे पास कुछ हार्डवेयर हैं जिन्हें मैं अनुकरण करना चाहता हूं; मुझे आश्चर्य है कि मैं इसे इस तरह के निम्न स्तर पर कर सकता हूं।स्मृति-मैप किए गए I/O

#include <stdint.h> 
struct MyControlStruct 
{ 
    uint32_t data_reg_1; 
    uint32_t data_reg_2; 
    uint32_t dummy[2]; // to make the following registers have certain addresses 
    uint32_t control_reg_1; 
    uint32_t control_reg_2; 
}; 
volatile struct MyControlStruct* MyDevice = (struct MyControlStruct*)0xDeadF00; 

तो, मैं विंडोज पर हार्डवेयर का उपयोग और लिनक्स के लिए निम्न सिंटैक्स का समर्थन करना चाहते: हार्डवेयर कई रजिस्टरों, जो मैं एक struct में व्यवस्था है

MyDevice->data_reg_1 = 42; 
MyDevice->data_reg_2 = 100; 
MyDevice->control_reg_1 = 1; 

जब कोड की अंतिम पंक्ति निष्पादित किया गया है, मैं हार्डवेयर एमुलेटर को "जागने" और कुछ सामान करने के लिए चाहता हूं। क्या मैं इसे विंडोज और/या लिनक्स पर कार्यान्वित कर सकता हूं? मैंने किसी भी तरह से "सेगमेंटेशन गलती" सिग्नल को पकड़ने के बारे में सोचा, लेकिन यह सुनिश्चित नहीं है कि यह विंडोज़ पर किया जा सकता है या नहीं।

मैंने mmap के मैनुअल पेज को देखा; ऐसा लगता है कि यह मदद कर सकता है, लेकिन मुझे समझ में नहीं आया कि मैं इसका उपयोग कैसे कर सकता हूं।

बेशक

, मैं सार WriteToMyDevice जैसे कार्यों को परिभाषित करने, और सब कुछ से हार्डवेयर के लिए उपयोग के लिए आसान (शायद) होगा सकता है, लेकिन मैं समझने के लिए अगर मैं इस सटीक तरह से मेरी हार्डवेयर के लिए उपयोग की व्यवस्था कर सकते चाहते हैं।

+0

आपका "निम्न स्तर" बहुत अधिक है ... विंडोज़ और लिनक्स हार्डवेयर दोनों में कर्नेल मोड से किया जाता है। हार्डवेयर के साथ बात करने के तरीके के बारे में आपको अधिक कार्यान्वयन विवरणों के बारे में सोचना होगा। उदाहरण के लिए, आप असली ड्राइवर और ड्राइवर अनुकरण लिख सकते हैं। –

+0

तो, उपयोगकर्ता मोड में पूर्व परिभाषित स्मृति पते का उपयोग करना असंभव है? – anatolyg

+0

आप सीधे मेमोरी एक्सेस का उपयोग कर उपयोगकर्ता मोड विंडोज/लिनक्स से हार्डवेयर डिवाइस से बात नहीं कर सकते हैं। यह केवल कर्नेल मोड में संभव है। यही कारण है कि मैं आपको कार्यान्वयन विवरण के बारे में पहले सोचने का सुझाव देता हूं। उनके बिना आप वास्तव में नहीं जानते कि अनुकरण करने के लिए क्या करना है। –

उत्तर

2

सिद्धांत रूप में, आप SIGSEGV के लिए एक हैंडलर कोड (अप्रत्याशित रूप से) कर सकते हैं जो अवांछित पृष्ठों तक पहुंचने और संभाल लेगा, और यह जांच सकता है कि एक निर्दिष्ट पता एक्सेस किया गया है।

लिनक्स के तहत ऐसा करने के लिए, आपको sigaction सिस्टम कॉल SA_SIGINFO के साथ उपयोग करने की आवश्यकता होगी और ucontext_t* अपने सिग्नल हैंडलर के तीसरे तर्क का उपयोग करें।

यह बेहद अप्राप्य है: आपको अलग-अलग यूनिक्स के लिए अलग-अलग कोड करना होगा (शायद आपके लिनक्स कर्नेल की संस्करण संख्या भी मायने रख सकती है) और प्रोसेसर बदलते समय।

और मैंने सुना है कि लिनक्स कर्नेल इस तरह के हैंडलिंग पर बहुत जल्दी नहीं हैं।

अन्य बेहतर कर्नल (हर्ड, प्लान 9) उपयोगकर्ता-स्तर की पेजिनेशन प्रदान करते हैं, जो मदद करनी चाहिए।

1

वास्तविकता में आपका एमुलेटर शुद्ध उपयोगकर्ता स्थान कोड के साथ लिनक्स पर संभव है (बल्कि क्रूरता से) संभव है।

एमुलेटर निर्माण के लिए, बस एक दूसरे धागे या प्रक्रिया है (साझा स्मृति, या शायद एक mmap'd फ़ाइल और का उपयोग कर inotify) स्मृति जो स्मृति मैप किए गए डिवाइस

नकल है असली हार्डवेयर ड्राइवर के लिए देख रहा है , आपको कर्नेल कोड के एक छोटे से बिट की आवश्यकता होगी, लेकिन यह केवल कुछ ऐसा हो सकता है जो वास्तविक हार्डवेयर पते को उचित अनुमतियों के साथ उपयोगकर्ता स्थान में मैप करता है। असल में यह एक आधुनिक बहुउद्देशीय परिचालन माहौल को पुराने डॉस बॉक्स या एक साधारण माइक्रो-नियंत्रक की तरह अभिनय करने के लिए नीचे दबाता है - महान अभ्यास नहीं, लेकिन कम से कम काम करने योग्य जहां सुरक्षा चिंता का विषय नहीं है।

एक और चीज जिसे आप विचार कर सकते हैं वह वर्चुअल मशीन में कोड चलाएगा।

यदि आप जिस कोड का प्रयोग करेंगे, वह स्वयं है, तो संभव है कि इसे शुरू करने के लिए पोर्टेबल तरीके से लिखना बेहतर होगा, हार्डवेयर प्लेटों को उन कार्यों में शामिल करना जिन्हें आप प्रत्येक प्लेटफॉर्म (यानी ओएस, हार्डवेयर संस्करण या भौतिक/नकली)। ये तकनीकें अधिक उपयोगी हैं अगर यह किसी और का मौजूदा कोड है जिसके लिए आपको पर्यावरण बनाने की आवश्यकता है। एक और चीज जिसे आप विचार कर सकते हैं (यदि मूल बहुत कड़ाई से एकीकृत नहीं है) विशिष्ट कार्यों के गतिशील-पुस्तकालय स्तर के अवरोध का उपयोग कर रहा है, उदाहरण के लिए लिनक्स पर एलडी_PRELOAD या विंडोज़ पर एक रैपर डीएलएल के साथ। या उस मामले के लिए, बाइनरी पैचिंग।

1

मैं शुरू में आपके प्रश्न को गलत समझता हूं। आपके पास मेमोरी मैप किए गए हार्डवेयर का एक टुकड़ा है और आप चाहते हैं कि आपका इम्यूलेशन बाइनरी संगत हो। विंडोज़ पर आप वर्चुअलअलोक का उपयोग करके संरचना के लिए स्मृति आवंटित कर सकते हैं और इसे एक गार्ड पेज बना सकते हैं और एसईएच का उपयोग करके इसे एक्सेस कर सकते हैं।

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