का अनुकरण कैसे करें मेरे पास कुछ हार्डवेयर हैं जिन्हें मैं अनुकरण करना चाहता हूं; मुझे आश्चर्य है कि मैं इसे इस तरह के निम्न स्तर पर कर सकता हूं।स्मृति-मैप किए गए 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
जैसे कार्यों को परिभाषित करने, और सब कुछ से हार्डवेयर के लिए उपयोग के लिए आसान (शायद) होगा सकता है, लेकिन मैं समझने के लिए अगर मैं इस सटीक तरह से मेरी हार्डवेयर के लिए उपयोग की व्यवस्था कर सकते चाहते हैं।
आपका "निम्न स्तर" बहुत अधिक है ... विंडोज़ और लिनक्स हार्डवेयर दोनों में कर्नेल मोड से किया जाता है। हार्डवेयर के साथ बात करने के तरीके के बारे में आपको अधिक कार्यान्वयन विवरणों के बारे में सोचना होगा। उदाहरण के लिए, आप असली ड्राइवर और ड्राइवर अनुकरण लिख सकते हैं। –
तो, उपयोगकर्ता मोड में पूर्व परिभाषित स्मृति पते का उपयोग करना असंभव है? – anatolyg
आप सीधे मेमोरी एक्सेस का उपयोग कर उपयोगकर्ता मोड विंडोज/लिनक्स से हार्डवेयर डिवाइस से बात नहीं कर सकते हैं। यह केवल कर्नेल मोड में संभव है। यही कारण है कि मैं आपको कार्यान्वयन विवरण के बारे में पहले सोचने का सुझाव देता हूं। उनके बिना आप वास्तव में नहीं जानते कि अनुकरण करने के लिए क्या करना है। –