मैं कुछ सी कोड को परिवर्तित कर रहा हूं जो एमएमएपी के माध्यम से डिवाइस ड्राइवर को एक्सेस करता है। मैंने सोचा कि मैं पाइथन में आसानी से बहुत ही समान चीजें कर सकता हूं। हालांकि मैं इस मुद्दे में भाग गया है। जिस पते को mmaped किया जाना है उसे पीसीआई कॉन्फ़िगरेशन द्वारा प्रदान किया जाता है, इसलिए इस पते पर मेरा कोई नियंत्रण नहीं है। इस मामले में, पता पता 3451912192 है। पता फ़ील्ड निश्चित रूप से एक हस्ताक्षरित पूर्णांक है, और 32-बिट्स है।पायथन, बहुत बड़े पते के साथ एमएमएपी को कॉल करने से अतिप्रवाह अपवाद
यह पता केवल उस सीमा में होता है जहां यह एक हस्ताक्षरित पूर्णांक में फिट बैठता है लेकिन हस्ताक्षरित पूर्णांक नहीं होता है। जब मैं mmap कहते हैं, मैं निम्नलिखित अपवाद:
OverflowError: long int too large to convert to int
तो अजगर कृत्रिम रूप से मुझे नंबर कह रहा है फिट नहीं करता है, क्योंकि यह सोचता है कि यह हस्ताक्षर किए है। क्या इसे किसी भी तरह हल करना संभव है, या मुझे सी में एमएमएपी कॉल करना है?
ध्यान दें कि बराबर नकारात्मक मूल्य को सूचक परिवर्तित करने देता है:
OverflowError: memory mapped offset must be positive
eryksun बताते हैं कि सी इंटरफ़ेस वास्तव में, एक हस्ताक्षरित मान निर्दिष्ट करता है तो अजगर को देखने के एक बिंदु से अर्थ सही है लेकिन यह जीत लिया ' मुझे इस प्रतिबंध को बाधित करने दें जो सी प्रोग्राम अनदेखा करने में सक्षम है।
दरअसल, lspci
पता चलता है कि इस उपकरण संसाधन है:
Memory at cdc00000 (32-bit, non-prefetchable) [size=1M]
और 0xcdc00000==3451912192
। यह कम से कम प्रतीत होता है कि offset > 0
mmap
में चेक शायद सही नहीं है। यह क्यों जांचें? अगर ऑपरेटिंग सिस्टम समर्थित नहीं है तो ऑपरेटिंग सिस्टम एक त्रुटि कोड लौटाए।
आप mmap (fd) के पहले तर्क के रूप में क्या गुजर रहे हैं? –
'posix.open ("/dev/mem ", posix.O_RDWR) का आउटपुट'। – Steve
@ एरिक्सम: यह 32-बिट सिस्टम है। आप सही हैं, 'off_t' वास्तव में एक हस्ताक्षरित प्रकार है। फिर भी मैंने सत्यापित किया है कि सी कोड जो मैं कॉपी करने की कोशिश कर रहा हूं वह इस तरह का मान गुजर रहा है। यदि मैं इसे समकक्ष ऋणात्मक मान में परिवर्तित करता हूं तो 'mmap' मॉड्यूल भी मुझे एक त्रुटि देता है। मुझे लगता है कि मैं अपने स्वयं के 'mmap' को ctypes के माध्यम से कार्यान्वित करने का प्रयास कर सकता हूं। – Steve