जहां तक मुझे पता है, ioctl()
उपयोगकर्ताओं के अनुप्रयोगों के लिए "विस्तारित" सिस्टम कॉल इंटरफ़ेस का पर्दाफाश करने के लिए उपयोग किया जाता है। विशिष्ट ड्राइवरों के लिए अद्वितीय हजारों सिस्टम कॉल जोड़ने के बजाय, ioctl()
का उपयोग एकल सिस्टम कॉल के माध्यम से एक्स्टेंसिबल ड्राइवर-विशिष्ट फ़ंक्शंस प्रदान करने के लिए किया जाता है।ioctl() और कर्नेल हेडर पर भ्रम
यह पर्याप्त स्पष्ट लगता है। हालांकि, मैं अपना पहला एप्लिकेशन संकलित करने की कोशिश कर रहा हूं जो ioctl()
कॉल का उपयोग करता है, और मुझे अपनी समझ पर संदेह करना शुरू हो रहा है।
विशेष रूप से, मैं एक ioctl()
एक ईएमएमसी डिवाइस को "sanitize" करने के लिए कॉल करना चाहता हूं। /usr/include/linux/mmc/ioctl.h
पर एक नज़र ले रहा है (या include/uapi/linux/mmc/ioctl.h
पर गिरी स्रोत में), मैं इस संरचना देख सकते हैं:
struct mmc_ioc_cmd {
// Most fields omitted
int write_flag;
__u32 opcode;
__u32 arg;
};
यूज़रस्पेस से, मैं इस हेडर सहित और मेरे ioctl()
कॉल में इस संरचना गुजर किसी भी मुद्दे नहीं है।
तो यह मेरा अंतिम स्वच्छ स्निपेट ऐसा दिखता है क्या है:
int sanitize(int fd)
{
struct mmc_ioc_cmd command;
memset(&command, 0, sizeof(command));
command.write_flag = 1;
command.opcode = MMC_SWITCH;
command.arg = EXT_CSD_SANITIZE_START << 16;
return ioctl(fd, MMC_IOC_CMD, &command);
}
मेरे समस्या यह है कि MMC_SWITCH
और EXT_CSD_SANITIZE_START
दोनों कर्नेल हेडर में निर्धारित किए जाते हैं। विशेष रूप से, मेरे कर्नेल स्रोत में, वे दोनों include/linux/mmc/mmc.h
पर पाए जाते हैं।
इंटरनेट पर जो कुछ भी मैंने देखा है, में उपयोगकर्ता स्पेस प्रोजेक्ट बनाने के दौरान कर्नेल स्रोत से शीर्षलेख शामिल हैं। यदि ऐसा है, तो आप एमएमसी ioctl()
का उचित रूप से उपयोग कैसे कर सकते हैं? कर्नेल संरचना को ioctl()
में पास करने के लिए खुलासा करता है, लेकिन ऐसा लगता है कि आप केवल कर्नेल स्रोत में छिपे हुए "छिपा" स्थिरांक के साथ इसे भरकर संरचना का उपयोग कर सकते हैं।
मेरा वर्तमान समाधान कर्नेल हेडर से आवश्यक परियोजनाओं को प्रतिलिपि बनाना है, लेकिन यह मेरे लिए गंदा लगता है।
क्या मैं ioctl()
के लिए उपयोग-केस को गलत समझ रहा हूं? क्या यह एक डिजाइन निरीक्षण है?
FWIW, [mmc-utils] के स्रोत [http://git.kernel.org/cgit/linux/kernel/git/cjb/mmc-utils.git/) में स्वयं का शामिल है कर्नेल हेडर से प्राप्त हेडर। –