2008-11-08 14 views
18

मैं एक लिनक्स कर्नेल मॉड्यूल लिख रहा हूं जिसे फ़ाइलों को खोलने और पढ़ने की आवश्यकता है। इसे पूरा करने का सबसे अच्छा तरीका क्या है?लिनक्स कर्नेल मॉड्यूल में फ़ाइल I/O

+0

संभावित डुप्लिकेट [पढ़ने के लिए कैसे/एक लिनक्स कर्नेल मॉड्यूल के भीतर फाइलें लिखने?] (Http://stackoverflow.com/questions/1184274/how-to-read-write-files-within-a- लिनक्स-कर्नेल-मॉड्यूल) –

उत्तर

30

क्या मैं पूछ सकता हूं कि आप फ़ाइल खोलने का प्रयास क्यों कर रहे हैं?

मुझे लिनक्स विकास का पालन करना पसंद है (जिज्ञासा से, मैं कर्नेल डेवलपर नहीं हूं, मैं जावा करता हूं), और मैंने पहले इस प्रश्न की चर्चा देखी है। मैं इसके बारे में LKML message ढूंढने में सक्षम था, मूल रूप से इसका उल्लेख करना आमतौर पर एक बुरा विचार है। मैं लगभग सकारात्मक हूं कि एलडब्ल्यूएन ने पिछले साल इसे कवर किया था, लेकिन मुझे लेख ढूंढने में परेशानी हो रही है।

यदि यह एक निजी मॉड्यूल है (जैसे कुछ कस्टम हार्डवेयर और मॉड्यूल वितरित नहीं किया जाएगा) तो आप यह कर सकते हैं, लेकिन मुझे लगता है कि यदि आप अपना कोड मुख्य लाइन पर सबमिट करने जा रहे हैं तो यह स्वीकार नहीं किया जा सकता है।

इवान टेरन ने sysfs का उल्लेख किया, जो मुझे एक अच्छा विचार लगता है। यदि आपको वास्तव में कड़ी कस्टम सामग्री करने की ज़रूरत है तो आप हमेशा नए ioctrls बना सकते हैं।

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

ठीक है, मैं लेख मैं खोज रहा था पाया, यह Linux Journal से है। यह बताता है कि इस तरह की चीजें क्यों करना आम तौर पर एक बुरा विचार है, फिर भी आपको यह बताने के लिए चला जाता है कि वैसे भी इसे कैसे किया जाए।

+0

यह एक कस्टम मॉड्यूल है, इसे वितरित नहीं किया जाएगा।मुझे एक फ़ाइल खोलने की ज़रूरत है जिसमें inodes => चेकसम का मैपिंग शामिल है। – mipadi

+1

@ मिपाडी: मुझे वह आलेख मिला जो मैं सोच रहा था, यह बताता है कि कर्नेल से फ़ाइल को खोलने और पढ़ने के तरीके ("ऐसा न करें" भाग के बाद)। मैंने अपनी पोस्ट को प्रतिबिंबित करने के लिए संपादित किया है और लिंक शामिल किया है। सौभाग्य। – MBCook

8

मानते हुए कि आपके open/read/close सिस्टम कॉल से प्रासंगिक समारोह संकेत की ओर इशारा प्राप्त कर सकते हैं, तो आप कुछ इस तरह कर सकते हैं:

mm_segment_t fs = get_fs(); 
set_fs(KERNEL_DS); 

fd = (*syscall_open)(file, flags, mode); 
if(fd != -1) { 
    (*syscall_read)(fd, buf, size); 
    (*syscall_close)(fd); 
} 
set_fs(fs); 

आप "syscall_*" समारोह संकेत मैं बनाने की आवश्यकता होगी हालांकि दिखाया गया है। मुझे यकीन है कि एक बेहतर तरीका है, लेकिन मेरा मानना ​​है कि यह काम करेगा।

1

आप इस Linux Kernel Module Programing Guide में sys_call_open के बारे में कुछ जानकारी भी प्राप्त कर सकते हैं।

+0

हाँ, मैंने इसे देखा है। संयोग से, मैं _am_ खुले (2) सिस्टम कॉल को पैच कर रहा हूं, और मुझे वास्तव में एक फ़ाइल _inside_ मेरे पैच किए गए संस्करण को पढ़ने की आवश्यकता है। – mipadi

2

आम तौर पर, यदि आपको कर्नेल मॉड्यूल से फ़ाइलों को पढ़ने/लिखने की आवश्यकता है, तो आप कुछ गलत वास्तुशिल्प कर रहे हैं।

कर्नेल मॉड्यूल को उपयोगकर्तास्पेस सहायक प्रक्रिया से बात करने की अनुमति देने के लिए तंत्र (उदाहरण के लिए नेटलिंक - या सिर्फ एक वर्ण डिवाइस पंजीकृत करें) मौजूद हैं। वह उपयोगकर्तास्पेस सहायक प्रक्रिया जो कुछ भी चाहती है वह कर सकती है।

आप उपयोगकर्ता स्पेस में खोले गए फाइल डिस्क्रिप्टर को लेने और कर्नेल से इसे पढ़ने/लिखने के लिए सिस्टम कॉल (या जैसे) को भी कार्यान्वित कर सकते हैं।

यह शायद कर्नेल स्पेस में फ़ाइलों को खोलने की कोशिश करने से पहले साफ होगा।

कुछ अन्य चीजें हैं जो कर्नेल स्पेस से पहले ही फाइलें खोलती हैं, आप उन्हें देख सकते हैं (लूप ड्राइवर स्प्रिंग्स दिमाग में?)।

+0

मैंने वास्तव में/proc में फ़ाइल से पढ़ने के लिए तंत्र को बदल दिया है, इसलिए मुझे शायद फ़ाइल को सीधे पढ़ने की आवश्यकता नहीं होगी। – mipadi

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