LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 10882|回复: 34

file_operation这个关键的数据结构在那个头文件中?

[复制链接]
发表于 2004-7-26 18:11:03 | 显示全部楼层 |阅读模式
usr/src/linux-2.6.6/kernel/drivers/mdeida/video/saa7134目录下有如下组成部分:
xxx.c, xxx.h, kconfig, makefiel文件组成, 其中在makfile中如下:
saa7134-objs :=saa7134-cards.o saa7134-core.o saa7134-i2c.o
saa7134-oss.o saa7134-ts.o 等等
obj-$CONFIG_VIDEO_SAA7134+=saa7134.o saa6752hs.o
这里我不明白的是:变量config_video_saa7134在哪里定义的, 整个文件的意思是什么!(是不是最后在/lib/modules/kernel/2.6.6/drivers/media/video/saa7134/下面生成saa7134.ko和saa6752hs.ko两个驱动, 还是取决于在内核中的编译情况?), 而且我发现在/drivers/下面每个设备的目录下面都是有这样的部分组成的!即:xxx.c+xxx.h+kconfig+makefile. 我现在正着手研究linux下的驱动程序的编写!
生成xxx.ko或xxx.o驱动并不要求xxx.c源代码中一定有一个关键的数据结构的子程序具体的实现代码如
typedef struct file_operation{
int (*seek)(struct inode *, struct file *)
int (*open)(struct inode *, struct file *)
int (*close)(struct inode *, struct file *)
int (*ioctl)(struct inode *, struct file *)
int (*write)(struct inode *, struct file *)
int (*read)(struct inode *, struct file *)
int (*fnasyc)(struct inode *, struct file *)
这个关键的数据结构在那个头文件中?
向版主报告
发表于 2004-7-26 19:00:48 | 显示全部楼层
1.既然你编写驱动,那最好编写成模块(毕竟不是正式的内核开发)。
2.CONFIG_VIDEO_SAA7134是配置内核后的配置变量,它的取值决定了编译成模块还是编译进内核
3.file_operations是字符设备转换表,在init_module函数中用register_chrdev将bottom_half提供的文件操作函数与之挂钩,承上(驱动上半部)启下。
举例一则


  1. static struct file_operations ts_fops =
  2. {
  3.         .owner          = THIS_MODULE,
  4.         .open          = ts_open,
  5.         .release  = ts_release,
  6.         .read          = ts_read,
  7.         .poll          = ts_poll,
  8.         .mmap          = ts_mmap,
  9.         .ioctl          = ts_ioctl,
  10.         .llseek   = no_llseek,
  11. };
复制代码


这是它的原型

  1. [color=green][b]/*include/linux/fs.h*/[/b][/color]
  2. struct file_operations {
  3.         struct module *owner;
  4.         loff_t (*llseek) (struct file *, loff_t, int);
  5.         ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
  6.         ssize_t (*aio_read) (struct kiocb *, char __user *, size_t, loff_t);
  7.         ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
  8.         ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t, loff_t);
  9.         int (*readdir) (struct file *, void *, filldir_t);
  10.         unsigned int (*poll) (struct file *, struct poll_table_struct *);
  11.         int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
  12.         int (*mmap) (struct file *, struct vm_area_struct *);
  13.         int (*open) (struct inode *, struct file *);
  14.         int (*flush) (struct file *);
  15.         int (*release) (struct inode *, struct file *);
  16.         int (*fsync) (struct file *, struct dentry *, int datasync);
  17.         int (*aio_fsync) (struct kiocb *, int datasync);
  18.         int (*fasync) (int, struct file *, int);
  19.         int (*lock) (struct file *, int, struct file_lock *);
  20.         ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);
  21.         ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);
  22.         ssize_t (*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void __user *);
  23.         ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
  24.         unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
  25.         long (*fcntl)(int fd, unsigned int cmd,
  26.                         unsigned long arg, struct file *filp);
  27. };
复制代码
 楼主| 发表于 2004-7-26 20:08:26 | 显示全部楼层
比如说我现在正在使用一个应用:tvtime那么在tvtime.c中有几个系统调用如pent(), write(), close(),read(), 假如我这里的设备映像文件是/dev/video0, 当应用运行在用户态时,系统内核执行到open()系统调用时,产生一个trap中断,------------------>内核响应这个中断, 根据打开的设备文件/dev/video0,和他的主设备号, 从而找到该设备对应的驱动,------------------------>如何读取这个关键的数据结构中的子函数(即具体的实现的代码段), 这个关键的数据结构如何与在..../drivers/media/saa7134/saa7134_video.c(我这里假设我的驱动主程序是saa7134_video.c), 如何将控制权交给子函数去执行?------------------------->刚才讲到的init_modules()应该是在modprobe 或insmod中的子函数,但是这两个好像只是二进制文件,没有源码
 楼主| 发表于 2004-7-26 20:18:39 | 显示全部楼层
斑竹有没有搞过video for linux two(v4l2)编程, 特别是基于saa7134芯片的tv card的设备驱动?还有刚才的斑竹的"CONFIG_VIDEO_SAA7134是配置内核后的配置变量,它的取值决定了编译成模块还是编译进内核", 是先编译的内核才有该变量的吗?那么就是说先有编译内核,然后才有MAKEFILE文件, 这似乎行不通!还有一个重要的系统调用:ioctl()我一直没搞明白!谢谢!
发表于 2004-7-26 22:53:32 | 显示全部楼层
1.Makefile在源码目录里当然本来就有拉,而它的其中一个任务就是根据make config生成的编译环境变量来对内核进行按需编译。基本的知识一定要扎实哦。

2.至于你编写驱动的问题,这视乎你究竟要重新改造内核提供的saa7134驱动,还是自行编写一个辅助驱动。开发首先要构思出定位点。
发表于 2004-7-26 22:56:51 | 显示全部楼层
我总结出一幅关于file operations的示意图。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2004-7-26 23:09:51 | 显示全部楼层
设备驱动程序的操作函数注册过程(初始化模块)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2004-7-26 23:29:22 | 显示全部楼层
辛苦了一晚,终于把图给总结出来了。
现在根据图示,我来讲一下系统调用与驱动程序的接口这个话题吧。

System Call & Driver (home_king@163.com)

1.驱动模块被加载时调用init_module()函数初始化,它调用register_chrdev注册由特定主设备号指定的设备的操作函数集*fop(由驱动程序提供)

2.用户进程在用户态使用系统调用open返回该设备文件的文件描述符,而这个文件描述符就是系统调用与设备驱动程序的接口了。具体过程:搜索到设备文件的inode,根据inode的文件类型条目判断出这个文件是一个设备文件,然后以inode的主设备号条目为数组索引,从字符设备转换表(数组)中找到该设备的数组成员,这个成员是一个结构体,从这个结构体中提取驱动程序所注册的操作函数,最终确定了进程的struct file结构体。以后在用户态的open,write,read等操作就调用驱动程序提供的操作函数了,完成接口功能。

ps:其实v4l2是video for linux的第二代驱动,它作为一个驱动,本身必须遵循SVR4 DDI/DKI规范,以上我所谈论的就是这个。
还是老生常谈,希望各位能好好学习内核,知其然而知其所以然。
 楼主| 发表于 2004-7-27 09:28:18 | 显示全部楼层
先让我好好想想! ..................
 楼主| 发表于 2004-7-27 14:55:06 | 显示全部楼层
1:从用户态的open()如何转到核心态的sys_open()?
2:核心态函数sys_open()只在/linux/syscalls.h中给出函数原型, 在哪里给出其定义呢?
3:为什么sys_open()中的参数与struct file_operation中的函数指针参数不同
int (*open)(struct inode *inode, struct file *fiel)
在sys_open()中:
asmlinkage long sys_open(const char _usr *filename, int flags, int mode)
我不明白这里的asmlinkage的意思!
4:在/drivers/media/video/saa7134/saa7134-video.c主驱动中有如下子函数实现:
statics int video_open(struct inode *inode, struct file *flie)
..............
statics struct file_operation video_fops={
      ..............
      .open =      video_open;
      ................
}这里的.open=video_open就是子函数具体实现的代码! 原来是这里与关键数据结构发生关系!
5:斑竹讲到的flip_open()和open_namei()在哪里定义,有何作用?第一个图中的两条箭头线有何用意?
6:斑竹的"用户进程在用户态使用系统调用open返回该设备文件的文件描述符"有不明之处, fd就是返回的文件描述符, 他只是一个int型,如何从当接口呢?
谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表