2012-06-20 12 views
5

क्या लिनक्स कर्नेल मॉड्यूल से ioctl पर कॉल करना संभव है? क्या कोई इसका उदाहरण दे सकता है कि इसका उपयोग कैसे किया जाता है?लिनक्स में कर्नेल स्पेस से ioctl() का उपयोग कैसे करें?

+3

आपको वास्तव में ऐसा करने की ज़रूरत नहीं है। यदि आप कोई खोज करते हैं, तो आपको कर्नेल स्पेस के भीतर से मनमाने ढंग से सिस्कोल करने के तरीके के लिए कुछ हद तक कार्यान्वयन-निर्भर कोड मिलेगा, लेकिन कृपया इस तरह के मॉडल को तोड़ने के बिना अपना असली उद्देश्य पूरा करने का कोई तरीका है या नहीं। File_operations में –

उत्तर

5

आप sys_ioctl पर कॉल करने का प्रयास कर सकते हैं।
अगर कर्नेल CONFIG_COMPAT के साथ संकलित किया गया है तो इसे निर्यात किया जाता है।

या, यदि आपके पास डिवाइस ड्राइवर का struct file_operations है, तो आप सीधे ioctl हैंडलर को कॉल कर सकते हैं।

हालांकि, ioctl हैंडल सूचकांक अपेक्षा करता है कि वर्तमान में चल रहे प्रक्रिया के पता स्थान में सूचक पैरामीटर कर्नेल पता स्थान में नहीं है। copy_from_user का उपयोग उन्हें पढ़ने के लिए किया जाएगा। यदि आप कर्नेल पता स्थान पर पॉइंटर्स देते हैं, तो copy_from_user विफल हो जाएंगे। मैं नहीं देखता कि आप इसके आसपास कैसे होंगे।

संपादित करें:

यदि आप copy_from_user से नीचे दिए गए कोड के बीच ioctl हैंडलर कॉल करेंगे कभी असफल नहीं होंगे।

mm_segment_t fs; 

    fs = get_fs();  /* save previous value */ 
    set_fs (get_ds()); /* use kernel limit */ 

    /* system calls can be invoked */ 

    set_fs(fs); /* restore before returning to user space */ 
+1

ioctl हैंडलर को बहिष्कृत कर दिया गया है। क्या आप ioctl का उपयोग करने के लिए नए तरीके का पता लगा सकते हैं? – iammurtaza

+0

क्या आप विस्तृत कर सकते हैं कि get_fs() और set_fs() जादुई रूप से कर्नेल स्पेस को सिस्टम कॉल निष्पादित करने की अनुमति देता है, और इसके बाद "copy_from_user()" अब कोई समस्या क्यों उत्पन्न करता है? –

+0

'set_fs' उस तंत्र को प्रभावित करता है जो मान्य करता है कि 'copy_to_user' को दिए गए पते वास्तव में वर्तमान उपयोगकर्ता के पता स्थान में हैं। यह कर्नेल को लगता है कि वर्तमान पता स्थान कर्नेल पता स्थान है। – ugoren

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