Chinaunix首页 | 论坛 | 博客
  • 博客访问: 430004
  • 博文数量: 133
  • 博客积分: 936
  • 博客等级: 准尉
  • 技术积分: 1069
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 15:54
文章分类

全部博文(133)

文章存档

2016年(19)

2013年(22)

2012年(92)

分类:

2012-09-14 08:39:33



>>>>>>>在这里注册了两个设备/dev/tty 和 /dev/console,它们的主设备号相同,只是次设备号不同,为什么需要定义两个file_operations(tty_fops和 console_fops),不是说一个主设备号表示一个驱动吗?当打开其中一个设备的时候,是调用哪个file_operations结构?


哈哈,这个是个特例。
open一个字符设备的过程是从
VFS层open系统调用 ===> def_chr_fops-->open ===> cdev->fops->open ===> device specific operation

如果是同一类设备,比如系统中有多个framebuffer,那么就把共有的操作放在cdev->fops->open ,这时向系统注册的仅仅是这一个驱动程序;
将这类主设备号相同的一类设备(如/dev/fb0 /dev/fb1等)放在一个数组中,然后在cdev->fops->open 根据次设备号作为Index来调用体现不同设备差异的那些操作,即 device specific operation , 这就是为什么framebuffer/block 等硬件驱动中实现的都不是file_operations这种操作,而是跟具体设备相关的那些操作。
这就是所谓的一类设备都应一种驱动。


可以认为大多数简单的设备,仅仅需要实现到cdev->fops->open 这个位置,等他们变得复杂,能够提炼出共性的时候就 需要实现到[红色device specific operation 这个位置。

呵呵,不知道我说得清楚不?


阅读(991) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~