2011-07-19 7 views
9

मैं कुछ सी कोड को परिवर्तित कर रहा हूं जो एमएमएपी के माध्यम से डिवाइस ड्राइवर को एक्सेस करता है। मैंने सोचा कि मैं पाइथन में आसानी से बहुत ही समान चीजें कर सकता हूं। हालांकि मैं इस मुद्दे में भाग गया है। जिस पते को 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 > 0mmap में चेक शायद सही नहीं है। यह क्यों जांचें? अगर ऑपरेटिंग सिस्टम समर्थित नहीं है तो ऑपरेटिंग सिस्टम एक त्रुटि कोड लौटाए।

+0

आप mmap (fd) के पहले तर्क के रूप में क्या गुजर रहे हैं? –

+0

'posix.open ("/dev/mem ", posix.O_RDWR) का आउटपुट'। – Steve

+0

@ एरिक्सम: यह 32-बिट सिस्टम है। आप सही हैं, 'off_t' वास्तव में एक हस्ताक्षरित प्रकार है। फिर भी मैंने सत्यापित किया है कि सी कोड जो मैं कॉपी करने की कोशिश कर रहा हूं वह इस तरह का मान गुजर रहा है। यदि मैं इसे समकक्ष ऋणात्मक मान में परिवर्तित करता हूं तो 'mmap' मॉड्यूल भी मुझे एक त्रुटि देता है। मुझे लगता है कि मैं अपने स्वयं के 'mmap' को ctypes के माध्यम से कार्यान्वित करने का प्रयास कर सकता हूं। – Steve

उत्तर

1

मुझे एक बार एक ही समस्या थी, मैं 64 बिट-संकलित पायथन में 64 बिट मशीन पर डेटा का एक बड़ा-फिर -4 जीबी हिस्सा भी mmap चाहता था।

अगर मैं सही ढंग मुख्य कारण यह है कि यह ऐसा नहीं हो पाया था, कि सबसे बुनियादी अजगर-वस्तु struct एक वस्तु आकार सदस्य है, जो केवल 32 बिट होता है याद है। और इसे बदलने के लिए इतना मुश्किल है, कि आप कह सकते हैं, आपको पूरी भाषा को ओवरहाल करने की ज़रूरत है, और विशेष रूप से सभी संकलित एक्सटेंशन को ठीक करना होगा।

मुझे यकीन नहीं है, लेकिन यह शायद पाइथन 3.0 के साथ किया जा सकता है।

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