23. int (*check_flags)(int);

24. int (*flock) (struct file *, int, struct file_lock *);

25. ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);

26. ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);

27. int (*setlease)(struct file *, long, struct file_lock **);

28. };

对于这个结构体中的元素来说,大家可以看到每个函数名前都有一个“*”,所以它们都是指向函数的指针。目前我们只需要关心

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);

int (*open) (struct inode *, struct file *);

int (*release) (struct inode *, struct file *);

这几条,因为这篇文章就叫简单驱动。就是读(read)、写(write)、控制(ioctl)、打开(open)、卸载(release)。这个结构体在驱动中的作用就是把系统调用和驱动程序关联起来,它本身就是一系列指针的集合,每一个都对应一个系统调用。

但是毕竟 file_operation 是针对文件定义的一个结构体,所以在写驱动时,其中有一些元素是用不到的,所以在 2.6 版本引入了一个针对驱动的结构体框架:platform,它是通过结构体 platform_device 来描述设备,用 platform_driver 描述设备驱动,它们都在源代码目录下的 include/linux/platform_device.h 中定义,内容如下:

[cpp] view plain copy

1. struct platform_device {

2. const char * name;

3. int id;

4. struct device dev;

5. u32 num_resources;

6. struct resource * resource;

7. const struct platform_device_id *id_entry;