2011-06-07 7 views
5

मान लीजिए कि मैंने निम्नलिखित को परिभाषित किया है।उपयोगकर्ता स्थान से एक compat ioctl कैसे कॉल किया जाता है? क्या कोई कृपया कुछ उदाहरण प्रदान कर सकता है?

#define MY_IOCTL_CMD1 _IOR(MAGIC_NUMBER, 0x01, arg1) 
#define MY_IOCTL_CMD2 _IOW(MAGIC_NUMBER, 0x02, arg2) 
#ifdef CONFIG_COMPAT 
#define MY_COMPAT_IOCTL_CMD1 _IOR(MAGIC_NUMBER, 0x01, compat_arg1) 
#define MY_COMPAT_IOCTL_CMD2 _IOW(MAGIC_NUMBER, 0x02, compat_arg2) 
#endif 

अब जब हम उपयोगकर्ता अंतरिक्ष से ioctl करते हैं, हम आम तौर पर

ioctl(fd, MY_IOCTL_CMD1, &arg1) 

क्यू कार्य करें: हम वास्तव में MY_COMPAT_IOCTL_CMD1 अनुरोध के रूप में के साथ एक ioctl है की जरूरत है?

devide code में मेरे पास हैंडलर निम्नानुसार परिभाषित हैं। ioctl: device_ioctl

#ifdef CONFIG_COMPAT 
compat_ioctl: device_compat_ioctl 
#endif 

किसी को भी इस के आसपास कुछ स्पष्टीकरण प्रदान सकते हैं?

उत्तर

6

यह कंपैट सामग्री 64-बिट कर्नेल में 32-बिट प्रोग्राम चलाने के लिए है। जब आप 64-बिट कर्नेल पर 32-बिट प्रोग्राम से ioctl(fd, MY_IOCTL_CMD1, &arg1) पर कॉल करते हैं, तो कर्नेल file_operations संरचना में ioctl को .compat_ioctl फ़ंक्शन पर ले जाएगा। यह compat_ioctl फ़ंक्शन उपयोगकर्ता तर्क arg1 की प्रतिलिपि बनाने के लिए ज़िम्मेदार है जैसे कि यह compat_arg1 था, जो 32-बिट लेआउट का उपयोग करता है। compat_arg1 टाइपपीफ को कर्नेल में परिभाषित किया गया है ताकि जब 64-बिट के लिए संकलित किया गया हो, संरचना बिल्कुल उसी लेआउट की तरह है जो 32-बिट के लिए संकलित arg1 है।

MY_IOCTL_CMD1 की परिभाषा sizeof arg1 को cmd आईडी बनाते समय खाते में ले जाएगी। जब आप 32-बिट मशीन के लिए प्रोग्राम संकलित करते हैं, तो MY_IOCTL_CMD1 के लिए मान 64-बिट मशीन के लिए संकलित किए जाने से अलग होगा। हालांकि 32-बिट MY_IOCTL_CMD1 में कर्नेल में 64-बिट MY_COMPAT_IOCTL_CMD1 के समान मूल्य होना चाहिए।

उपयोगकर्ता-स्पेस एप्लिकेशन में compat_arg1 या MY_COMPAT_IOCTL_CMD1 का उपयोग करने की आवश्यकता नहीं है। वे केवल कर्नेल में संकलित कोड के लिए हैं।

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

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