2013-03-04 22 views
6

Tôi đang triển khai trình điều khiển thiết bị nhân vật Linux.Đối số "struct file_operations" là gì?

Tệp tiêu đề của Linux/fs.h liệt kê các tệp_operations không có tên đối số.

ví dụ:

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); 
}; 

Tài liệu cho tôi biết đối số ở đâu? Một số là loại rõ ràng, nhưng một số thì không. Tôi thích tham khảo tài liệu chính thức nếu tôi có thể, nhưng tôi không thể tìm thấy nó.

ví dụ:

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

Có hai đối số loff_t. Làm sao tôi biết họ làm gì?

Tôi đã được Googling và đọc cuốn sách trình điều khiển thiết bị, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào giải thích về các đối số. Một số đối số cũng đã thay đổi từ khi LDD3 được viết.

Trả lời

5

Sách LDD3 rất hữu ích để hiểu được bức tranh lớn, nhưng nó sẽ không giúp đỡ chi tiết (nó là dành cho hạt nhân 2.6.10, trong khi đó chúng tôi đang di chuyển về phía 3.9). kernelnewbies drivers page có lẽ là tài nguyên toàn diện được cập nhật nhất. Đối với các thay đổi hàng ngày, LWN thường xuyên nhận xét về các thay đổi API và xuất bản bản xem trước dài hơn cho các tính năng mới. H-online mang một loạt các bài viết chi tiết các thay đổi từ phiên bản hạt nhân sang phiên bản hạt nhân, với các liên kết đến các cuộc thảo luận và các bản vá lỗi.

+0

Đó là những địa điểm thông thường của tôi. Tôi đang viết và ghi lại cách viết trình điều khiển thiết bị cho một số người khác và tôi mất hoàn toàn để nói cho họ biết cách tìm thông tin này. Tôi đang cố gắng giành lấy trái tim và tâm trí, và cho họ thấy rằng Linux có giá trị, nhưng thật xấu hổ khi tôi không thể cho họ xem tài liệu hoàn chỉnh hoặc cập nhật cho một trong những cấu trúc có giá trị nhất cho trình điều khiển thiết bị! Tôi biết để xem xét các trình điều khiển khác và cố gắng để chỉ "làm việc nó ra" nhưng tôi không nghĩ rằng đó là đủ tốt. –

+0

Thật không may, đó là cách nó hoạt động. Tài liệu gần nhất mà bạn đang tìm kiếm là LDD trong thời hoàng kim của nó, nhưng (như là "3" chứng thực) hệ thống đã cố gắng mô tả những thay đổi nhanh chóng, và nó không theo kịp. Có lẽ cách tốt nhất để thoát khỏi ràng buộc là chỉ đào sâu vào kernelnewbies và cập nhật mô tả của họ? – vonbrand

+0

Tôi nghĩ rằng có thể là trường hợp, nghĩ rằng nó là giá trị kiểm tra như là nỗ lực cuối cùng của tôi. Tôi nhớ sử dụng LDD3 trở lại khi 2.4 đã được loại bỏ cho 2.6 hệ thống. Không lâu sau khi tôi nhận được cảnh báo "không được chấp nhận" trong khi chuyển các trình điều khiển thiết bị cũ hơn mặc dù tôi đã làm theo các ví dụ trong cuốn sách. Tôi đã không phải làm phát triển trình điều khiển thiết bị Linux trong nhiều năm, vì vậy tôi đang trong giai đoạn bắt đầu chạy-và-học-trên-công việc. Tôi đã hy vọng đó không phải là trường hợp nữa. –

1

Tôi phải triển khai trình điều khiển Linux đầu tiên của mình trong khi quay lại. Cho đến nay, điều tốt nhất tôi nghĩ bạn có thể làm là tải xuống nguồn Kernel cho phiên bản bạn đang phát triển. Trong cây nguồn kernel có một thư mục có tên/Documentation. Tôi bắt đầu ở đó, cuối cùng tôi đã kiểm tra đây là "Tài liệu chính thức" cho hạt nhân.

Điều đó đang được nói, một khi bạn có mã nguồn thực sự không phải là tài liệu tốt hơn là đọc mã và xem nó được sử dụng như thế nào. Đối với những thứ như thế này, tôi sẽ xem xét thông qua/drivers/fs/và tìm một ví dụ về nơi mà cấu trúc này được sử dụng và xem cách họ đang sử dụng nó.

Các vấn đề liên quan