linux 设备模型(三)

   前面两篇是记录linux设备模型的框架及底层实现,从整体上有了一个把握。在第二篇中记录了linux设备模型最底层实现的方法,说的简单点linux设备模型就是要把驱动和设备都串起来,对系统有一个一般性的描述,然后内核对这个统一的设备模型进行统一管理。而实现让内核获得系统整体配置信息的数据结构就是kobect和kset,所有的驱动和设备都包含kobject 和 kset,也就是kobject 和 kset 是父类。因此,内核就获得了系统所有设备和驱动的配置信息,内核在关机时就能够以正确的顺序遍历所有的设备。(在设备处于忙碌的状态时,如果突然关机会造成数据的丢失,当系统要关机时,首先遍历所有设备,通知忙碌的设备要关机!)

  本来打算在第三篇里面总结设备模型中的三要素:总线(bus),设备(device),驱动(driver)。但是,如果单纯总结这些东西并没有实用价值,总线、设备、驱动,如果直接从代码的角度去分析有点不好入手,因为这不像不带操作系统的串行执行的程序(虽然带操作系统的也是串行)可以一步步分析,当去分析设备那条线时由于驱动挂钩。所以,干脆总结总线(bus),设备(device),驱动(driver)的实现思想,因为代码也是依据设计思想,在掌握思想后再去阅读代码会简单很多,但是如果还是依据代码去分析实现的方法总是那么别扭!另外,总结分析基于设备模型的工程应用!因为工程的驱动并不是设备模型那各样,也就是说如果仅仅看ldd3 并不是写工程驱动代码。

设备模型设计思想:

    在linux设备模型中,关心总线,设备和驱动这3个实体,作为总线就是让设备和驱动就行绑定(match函数实现),在系统中没注册一个设备的时候,会寻找与之匹配的驱动(通过名字查找),同样,在系统中每注册一个驱动,会寻找与之匹配的设备(通过名字),匹配的工作由总线完成。注册设备的结果是在总线层有一个设备的链表,注册驱动的结果是在总线层有一个驱动的链表,总线层遍历这两个链表寻找相匹配的设备和驱动。

工程中设备驱动:

1. platform 驱动

   如果一个驱动要符合设备模型,那么它必须挂载一条总线上!但是这样会有一个问题,在嵌入式系统里面,SOC系统中集成的独立外设控制器,挂接在SOC上的内存空间并没有依附任何总线。基于这个问题,linux发明了一种虚拟总线----platform,相应的设备成为platform_device,相应的总线称为platform_driver。 从设计的角度看platform_device 是不稳定的部分(不同的bsp一般都不相同),platform_driver是比较稳定的部分(不同的bsp基本上不需要修改),这样带来的好处是尽可能减少了重复造轮子的可能!如何将一个字符驱动修改为 platform驱动呢?(也就是如何把字符驱动挂接在platform总线上)一般分为两个步骤:

1> 将驱动稳定部分修改为platform_driver

2> 在板文件中添加对设备的支持

注:在这个过程中并没有改变字符设备驱动的本质,我们只是认为的把字符设备驱动拆成两部分,一部分与bsp相关的代码(platform_device),一部分比较稳定的代码(platform_driver),然后套上platfform这个框架而已!

2. 设备驱动的分层思想

    linux内核完全由C语言和汇编语言写成,但是在代码中却频繁体现了面向度对象的思想。在驱动方面,一般是为同类的设备设计一个框架,而框架的核心层实现该设备通用的一些功能。如果具体的设备不想使用内核提供的工程,可以重载之(呵呵,没想到c语言也可以重载吧!)例如:

return_type core_funca(xxx_device *bottomo_dev, param1_type param1, param1_type  param2)
{
	if (bottom->funca)
		return bottom_dev->funca(param1, param2);
	/* 核心层通用的funca 代码  */
	......
}

上述core_funca实现中,会检测底层设备是否重载了funca,如果重载了,就调用底层的代码,否则,直接调用通用层的。从这里可以学到一个思想,就是c里面如果实现重载! 也告诉我们语言只是一门工具,面向对象的语言可以写出不面向对象的程序,同理,面向过程的语言也可以写成面向对象的程序。一切都在与思想!!!!

3. 主机与外设的分析思想

image

假设不进行主机和外设的分离,外设a,b,c和主机A,B,C进行组合的时候需要9个驱动。可以假想如果一共有m个主机控制器,n个外设,分离出结果是需要m+n个驱动,不分离这需要m×n个驱动,面对现在市面上五花八门的硬件,如果采用后者不分离的机制,估计T级的硬盘也不够装下这些驱动!

4. misc 设备驱动

在linux里面,把无法归类的五花八门的设备定义为混杂设备。linux内核提供了miscdevice有很强的包容性!(没有怎么了解,大概就知道这个概念,以后遇到再来看!)

linux设备模型就总结到这,在分析的过程中并没有深入到每个细节,而是从整体上把握,当然关键地方还是有点深入了! ^_^

posted @ 2013-03-30 22:37  lsx_007  阅读(321)  评论(0编辑  收藏  举报