PDA

View Full Version : file_operation



eldest_daica
19-02-2009, 09:59 PM
Chào mọi người .Khi mình tìm hiều về linux mình có gặp cấu trúc
static struct file_operations skel_fops = {
.owner = THIS_MODULE,
.read = skel_read,
.write = skel_write,
.open = skel_open,
.release = skel_release,
}


Mình đoán đây là một cấu trúc được quản lý bởi kernel của linux. Mình không chác lắm .Có ai có thể giải thích giùm mình về cách hoạt động của nó ,và ai có thể chỉ bảo cho mình về cơ chế quản lý của nhân linux được không .Nếu có tài liệu thì cho mình xin luôn .(8-)> Rất mong mọi người giúp !

Xcross87
19-02-2009, 10:51 PM
cái đó chắc là copy trong cái source USB nào đó hả. (skel_: là tiền tố sử dụng trong các USB driver)

Đây là định nghĩa trong source kernel:


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(*aio_read) (struct kiocb *, char __user *, size_t, loff_t);
ssize_t(*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t(*aio_write) (struct kiocb *, const char __user *, size_t,
loff_t);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *, struct file *, unsigned int,
unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, struct dentry *, 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(*readv) (struct file *, const struct iovec *, unsigned long,
loff_t *);
ssize_t(*writev) (struct file *, const struct iovec *, unsigned long,
loff_t *);
ssize_t(*sendfile) (struct file *, loff_t *, size_t, read_actor_t,
void __user *);
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);
};



để rút gọn đỡ rắc rối GNU GCC cho phép viết source đơn giản hơn xíu vói access.


struct file_operations fops = {
read: device_read,
write: device_write,
open: device_open,
release: device_release
};



trong ngứ pháp C99 thì:


struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
};


mấy cái device_xxxx ở trên là các hàm xử lý operation tương ứng nếu có signal hoặc event gọi.

Cấu trúc này thường sử dụng để viết các driver cho thiết bị.

Các device driver trong Linux được quản lý trong /dev

Muốn biết kernel thế nào thì nên đọc Kernel Documentation là rõ nhất.

eldest_daica
28-02-2009, 10:23 PM
cảm ơn anh đã giới thiệu .Em cũng đọc một bài viết của anh trên diễn đàn về cái driver demo .Thử biên dịch thành module thì thấy lỗi linh tinh .Mà toàn lỗi mấy cái file header .Anh thử biên dịch lại rồi giải đáp được ko .Em dùng Ubuntu 8 kernel 2.6.24-23 .Rất mong được anh giúp .!:)