>>>>>>>在这里注册了两个设备/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 这个位置。
呵呵,不知道我说得清楚不?
相关热门文章
给主人留下些什么吧!~~
评论热议