2013-03-04 5 views
6

मैं एक लिनक्स वर्ण डिवाइस ड्राइवर को कार्यान्वित कर रहा हूं।"struct file_operations" तर्क क्या हैं?

लिनक्स/fs.h हेडर फ़ाइल फ़ाइल नामों को तर्क नामों के बिना सूचीबद्ध करती है।

उदा।

struct file_operations { 
    struct module *owner; 
    loff_t (*llseek) (struct file *, loff_t, int); 
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 
    ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t); 
    ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); 
    int (*readdir) (struct file *, void *, filldir_t); 
    unsigned int (*poll) (struct file *, struct poll_table_struct *); 
    long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); 
    long (*compat_ioctl) (struct file *, unsigned int, unsigned long); 
    int (*mmap) (struct file *, struct vm_area_struct *); 
    int (*open) (struct inode *, struct file *); 
    int (*flush) (struct file *, fl_owner_t id); 
    int (*release) (struct inode *, struct file *); 
    int (*fsync) (struct file *, loff_t, loff_t, int datasync); 
    int (*aio_fsync) (struct kiocb *, int datasync); 
    int (*fasync) (int, struct file *, int); 
    int (*lock) (struct file *, int, struct file_lock *); 
    ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); 
    unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); 
    int (*check_flags)(int); 
    int (*flock) (struct file *, int, struct file_lock *); 
    ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); 
    ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); 
    int (*setlease)(struct file *, long, struct file_lock **); 
    long (*fallocate)(struct file *file, int mode, loff_t offset, 
       loff_t len); 
}; 

दस्तावेज कहां है जो मुझे बताता है कि प्रत्येक तर्क क्या है? कुछ स्पष्ट हैं, लेकिन कुछ नहीं हैं। अगर मैं कर सकता हूं तो मैं आधिकारिक दस्तावेज का उल्लेख करना पसंद करता हूं, लेकिन मुझे यह नहीं मिल रहा है।

उदा।

int (*fsync) (struct file *, loff_t, loff_t, int datasync); 

दो loff_t तर्क हैं। मुझे कैसे पता चलेगा कि वे क्या करते हैं?

मैं डिवाइस चालक पुस्तक गूंज रहा हूं और पढ़ रहा हूं, लेकिन मुझे कोई दस्तावेज नहीं मिल रहा है जो तर्क देता है कि तर्क क्या हैं। जब एलडीडी 3 लिखा गया था तब से कुछ तर्क भी बदल गए हैं।

उत्तर

5

एलडीडी 3 पुस्तक बड़ी तस्वीर को समझने के लिए अभी भी बहुत उपयोगी है, लेकिन यह विवरण के साथ मदद नहीं करेगा (यह कर्नेल 2.6.10 के लिए है, इस बीच हम 3.9 की ओर बढ़ रहे हैं)। kernelnewbies drivers page शायद सबसे अद्यतित, व्यापक संसाधन है। दिन-प्रतिदिन के बदलावों के लिए, LWN एपीआई परिवर्तनों पर नियमित रूप से टिप्पणियां देता है और नई सुविधाओं के लिए लंबे समय तक अवलोकन प्रकाशित करता है। H-online चर्चाओं और पैच के लिंक के साथ, कर्नेल संस्करण से कर्नेल संस्करण में परिवर्तनों का विवरण देने वाले लेखों की एक श्रृंखला रखता है।

+0

वे मेरे सामान्य स्थान देखने के लिए हैं। मैं लिख रहा हूं और दस्तावेज कर रहा हूं कि किसी अन्य लोगों के लिए डिवाइस ड्राइवर कैसे लिखना है और मुझे यह बताने के लिए एक पूर्ण नुकसान है कि यह जानकारी कैसे प्राप्त करें। मैं दिल और दिमाग जीतने की कोशिश कर रहा हूं, और उन्हें दिखाता हूं कि लिनक्स का मूल्य है, लेकिन जब मैं डिवाइस ड्राइवरों के लिए सबसे मूल्यवान structs में से एक के लिए उन्हें पूर्ण या अद्यतित दस्तावेज नहीं दिखा सकता तो यह शर्मनाक है! मुझे अन्य ड्राइवरों को देखने और केवल "इसे बाहर करने" की कोशिश करने के बारे में पता है, लेकिन मुझे नहीं लगता कि यह काफी अच्छा है। –

+0

दुर्भाग्यवश, यह वही तरीका है जो काम करता है। आपके द्वारा देखे जाने वाले दस्तावेज़ों के नजदीक एलडीडी था, लेकिन ("3" अनुरोधों के रूप में) प्रणाली ने इसे तेजी से परिवर्तनों का वर्णन करने की कोशिश की, और यह नहीं रहा। शायद बांध से बाहर निकलने का सबसे अच्छा तरीका सिर्फ कर्नेलन्यूज में खोदना और उनका विवरण अपडेट करना है? – vonbrand

+0

मुझे लगा कि यह मामला हो सकता है, सोचा कि यह मेरे आखिरी प्रयास के रूप में जांचने लायक था। मुझे याद है कि एलडीडी 3 का उपयोग करते समय 2.4 को 2.6 सिस्टम के लिए चरणबद्ध किया जा रहा था। पुरानी डिवाइस ड्राइवरों को पोर्ट करते समय मुझे "बहिष्कृत" चेतावनियां मिलने से बहुत पहले नहीं था, भले ही मैं पुस्तक में उदाहरणों का पालन कर रहा था। मुझे कई वर्षों तक लिनक्स डिवाइस ड्राइवर विकास नहीं करना पड़ा है, इसलिए मैं स्टार्ट-रनिंग-एंड-ऑन-द-जॉब चरण में हूं। मैं उम्मीद कर रहा था कि अब मामला नहीं था। –

1

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

कहा जा रहा है कि, एक बार आपके पास स्रोत कोड हो जाने के बाद कोड पढ़ने और देखने के लिए वास्तव में एक बेहतर प्रलेखन नहीं है। इस तरह की चीजों के लिए, मैं/ड्राइवर/एफएस/के माध्यम से देखता हूं और इस उदाहरण का उपयोग करने का एक उदाहरण ढूंढता हूं और देखता हूं कि वे इसका उपयोग कैसे कर रहे हैं।

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