2012-12-03 20 views
5

में इंटेल सीपीयू I/O रजिस्टरों तक पहुंचने का आसान तरीका मैं एक पीसीआई बोर्ड के साथ काम करता हूं जिसके लिए 256 बाइट टीएलपी पेलोड आकार की आवश्यकता होती है। मुझे सीपीयू मिला जो कि (कोर i7-3930K) और इंटेल मदरबोर्ड, डीएक्स 7 9 एसआर का समर्थन करता है जो BIOS में टीएलपी पेलोड आकार सेटिंग की पेशकश नहीं करता है। डिफ़ॉल्ट रूप से 128 बाइट अधिकतम टीएलपी पेलोड है और मुझे इसे BIOS के बिना 256 बाइट में बदलने की आवश्यकता है। मुझे पीसीआईयूटीएस सॉफ़्टवेयर मिला जो विंडोज़ में यह मान प्रदर्शित करता है लेकिन यह एक बहुउद्देशीय पोर्टेबल सॉफ़्टवेयर है और मुझे जो चाहिए उसे ढूंढना बहुत जटिल है।विंडोज

इंटेल दस्तावेज़ describe what values मुझे सीपीयू I/O रजिस्टरों में सेट करने की आवश्यकता है और another document कह रहा है कि I/O स्थान C8Fh और CFCh हैं।

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

कृपया मुझे बताएं कि कहां से शुरू करना है, या तो निष्पादन योग्य (आसान) या ड्राइवर से। मुझे लगता है कि मुझे केवल आई/ओ बंदरगाहों सी 8 एफएच और सीएफसीएच से पढ़ने/लिखना है, अगर मुझे गलत नहीं लगता है। यह अब विंडोज एक्सपी 32 बिट है, Win7 x64 बाद में होगा, विजुअल स्टूडियो 2010 सी ++ या डब्लूडीके।

उत्तर

2

मूल रूप से आपको out का उपयोग करना है, क्रमशः in x86 asm निर्देशों का उपयोग करें। बात यह है कि संरक्षित मोड में उन दो निर्देशों को बंद कर दिया गया है ताकि आप उन्हें उपयोगकर्तालैंड मोड में उपयोग न कर सकें।

डब्लूडीके (विंडोज चालक किट) प्राप्त करने और उनके नमूने देखने के लिए सबसे अच्छी जगह है (आपको इसके लिए केवल एक सॉफ्टवेयर ड्राइवर की आवश्यकता है)। यदि पीसीआई बोर्ड के लिए ड्राइवर कर्नेल मोड ड्राइवर है, तो आप DriverEntry फ़ंक्शन में केवल कॉल जोड़ सकते हैं और इसके साथ किया जा सकता है।

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

+0

धन्यवाद। मेरे पास डब्ल्यूडीके है और मैं इस बोर्ड के लिए ड्राइवर को संकलित कर सकता हूं, जो तब काम करता है। मैं निश्चित रूप से ड्राइवर प्रविष्टि देख सकता हूं लेकिन मैं यह नहीं बता सकता कि ड्राइवर कर्नेल मोड या उपयोगकर्ता मोड में काम करता है या नहीं। मैं ड्राइवरों से अपरिचित हूँ। तो, आप कह रहे हैं कि चालक के मुख्य कार्य में, जिसे ड्राइवर लोडिंग पर बुलाया जाता है, मैं _inp(), मेरी बिट्स सेट कर सकता हूं और फिर _outp (0xC8F। Mydata) जहां 0xC8F इंटेल के दस्तावेज़ से स्थान है, है ना? – user1871691

+0

@ user1871691 बहुत ज्यादा हाँ। यदि आपके कोड में 'DriverEntry' विधि है, तो यह केएमडीएफ का उपयोग कर रहा है, विधि को उपयोगकर्ता मोड ड्राइवरों के लिए अलग-अलग कहा जाता है (कभी भी उन लोगों का उपयोग नहीं किया जाता है)। कोड को अपडेट करने के लिए बहुत सीधे आगे होना चाहिए। – Voo

+0

बहुत बहुत धन्यवाद। वह काम किया। मैंने ड्राइवर लाइनों में 4 लाइनें डालीं: _outpd (0xCF8, 0x80000098); एकमात्र चाल यह थी कि मुझे दो उपकरणों के लिए रजिस्ट्रार सेट करना पड़ा। मेरे पीसीआई स्लॉट में पता है बस: 0 डिवाइस: 1 फंक्शन: 0, लेकिन मुझे बस के लिए टीएलपी आकार भी सेट करना पड़ा: 0 डिवाइस: 0 फंक्शन: 0 (कुछ जेनेरिक डिवाइस, मुझे लगता है) – user1871691