Ioctl (), unlocked_ioctl () और compat_ioctl () में क्या अंतर है?


37

Lxr.linux.no पर लाइनक्स 2.6.36 स्रोत कोड के माध्यम से जा रहा है, मुझे इसमें ioctl()विधि नहीं मिली file_operations। इसके बजाय मुझे दो नई कॉल मिलीं: unlocked_ioctl()और compat_ioctl()। बीच क्या अंतर है ioctl(), unlocked_ioctl()और compat_ioctl()?

जवाबों:


39

मेटा-उत्तर: लिनक्स कर्नेल के लिए होने वाला सभी कच्चा सामान lkml (लिनक्स कर्नेल मेलिंग सूची) से होकर जाता है । खोजपूर्ण सारांश के लिए, पढ़ें या खोज करें lwn (लिनक्स साप्ताहिक समाचार)

उत्तर: जोनाथन कार्बेट द्वारा ioctl () के नए तरीके से :

ioctl()कर्नेल के शेष हिस्सों में से एक है जो बिग कर्नेल लॉक (BKL) के तहत चलता है। अतीत में, बीकेएल के उपयोग ने ioctl()असंबंधित प्रक्रियाओं के लिए लंबी विलंबता बनाने के लिए लंबे समय तक चलने वाले तरीकों के लिए संभव बना दिया है।

पेश किए गए unlocked_ioctlऔर compat_ioctl2.6.11 में पैच की व्याख्या का अनुसरण करता है । क्षेत्र का निष्कासनioctl बहुत बाद में हुआ, 2.6.36 में।

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

compat_ioctlवास्तव में असंबंधित है, भले ही इसे उसी समय जोड़ा गया हो। इसका उद्देश्य 32-बिट उपयोगकर्ता के कार्यक्रमों को ioctl64-बिट कर्नेल पर कॉल करने की अनुमति देना है । अंतिम तर्क का अर्थ ioctlड्राइवर पर निर्भर करता है, इसलिए ड्राइवर-स्वतंत्र रूपांतरण करने का कोई तरीका नहीं है।


1
मैं नवीनतम ioctl स्रोत पर देख रहा था और देखा कि syscall कुछ जाँच करता है और फिर यहाँ कूदता है । क्या आप जानते हैं कि मैं ioctl प्रणाली के बारे में और जानकारी कहां से जुटा सकता हूं? मुझे इस बात में दिलचस्पी है कि चरित्र फ़ाइलों पर ioctl कमांड उपयुक्त चालक को कैसे रूट किए जाते हैं। क्या इसके माध्यम से unlocked_ioctlऐसा होता है? तथ्य यह है कि एक फ़ंक्शन पॉइंटर प्रति फ़ाइल (इस मामले में struct file) का उपयोग किया जाता है, ऐसा लगता है कि मैं करीब हो सकता हूं। क्या unlocked_ioctlड्राइवर की शुरुआत के बाद चरित्र फ़ाइलों के लिए पंजीकृत है mknod?
sherrellbc

1
@sherrellbc डिवाइस ड्राइवर फ़ाइल जैसे तरीकों से निपटने पंजीकृत करता है unlocked_ioctlएक में struct file_opsजब यह शुरू होता है, और वे से भर जाती है struct file_opsजब फ़ाइल को खोलने पर फ़ाइल वस्तु में। mknodइसमें कोई भूमिका नहीं।
गिलेस एसओ-

समझा। मैं सोच रहा था कि एक डिवाइस ड्राइवर को पहले mknodसे ही (के माध्यम से unlocked_ioctl) संबंधित फ़ाइल संचालन को पुनर्निर्देशित करने से पहले एक चरित्र डिवाइस के माध्यम से अपने इंटरफ़ेस को उजागर करना होगा ।
शेरेल्बिक

4

ऐसे मामले होते हैं जब कर्नेल 2.6.36 में कंपोजिट_आईएक्टल () के लिए (फाइल / लाइन / एफएचएच) स्ट्रक्चर फाइल_ऑपरेशन मेथड ioctl () शामिल नहीं है (जैसे कुछ डिवाइस ड्राइवर्स के लिए) और अनलॉक किए गए .ioctl () का उपयोग नहीं किया जाना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.