Linux为什么要引入平台驱动


Linux简单字符驱动很简单,只需要在初始化时对物理地址进行映射,再注册一个fileopenration操作集,然后就和写裸机程序一样实现操作集就可以了。

问题一:为什么要进行物理地址到虚拟地址的映射?   因为引入了MMU内存管理,只允许用户操作虚拟地址。

问题二:为什么要引入MMU,而不让用户直接操作物理地址?

因为内存管理非常复杂,主要是为了安全考虑。假如:驱动甲用到了一块物理地址0x20000000进行操作,驱动乙也刚好用到了这块物理地址。这种情况怎么办?注意,这时候并不会报错,可能发生的事情不可预料。而用虚拟地址为种情况就可以避免发生了,该物理地址要是已有人用,内核会提醒映射失败用户则可以考虑另选一块物理地址映射。百度的结果:第一,是安全。第二,便捷。第三,统一通用。第四,方便管理。第五,便于应用…

可是这么简单的驱动你几乎是在Linux内核里看不到了,几乎所有内核带的驱动都是平台驱动.(你自己写的除外)

问题三:Linux为什么要引入平台驱动来增加驱动的开发难度呢?  答案就是:便于移植。

打个比方:从你家到北京。如果你知道地形的话随便怎么走都可以到北京。www.bkjia.com 可是现在要所有的人都能从你家到北京,大部分人可能都不会走,这时候该怎么办?当然你可以带他们走,可是我们讲的是所有人。这时候可以这样,修一条高速公路从你家到北京,然后所有的人(包括认路的不认路的,会开车的不会开车的)只需要按照一定规则在路边等待专车就可以了,车子会带你到北京。

缺点:必须要先修一条从你家到北京的路,然后请一些有专业经验的司机。

优点:原本所有人需要学会认路的本领自己上北京,现在只需要知道一些车子的信息在公路旁边按照一定规则等就可以了(你只需要知道你坐哪一路车,然后告诉司机你到哪下就行了)。

1、修一条路就好比建一条平台总线,有经验的司机就好比各种器件的原始设备厂商。

2、所有人就表示要做平板电脑,手机…各种的系统产品制造商。

3、“坐哪一路车,告诉司机到哪下”就是我们移植驱动需要告诉内核我们不同的芯片使用的硬件资源是哪些。

分析:建立一条平台总线,这事Linux帮你做了, 各种各样复杂的驱动(各种网卡芯片,传感器芯片…)原始设备厂商他帮你实现了驱动与硬件无关的驱动部分。(当然也不要佩服这些人,因为这些人他们只会写一种驱动,就是说网卡产商他们专门写网卡驱动,只写一种驱动从无到有并不是很困难)

好了,现在最难的部分都让有Linux内核和原始设备厂商都帮我们做了。我们只需要在驱动移植的时候告诉驱动我们使用的硬件资源就行了。

总结:随着Linux内核越来越复杂化Linux从2.6开始引入了平台驱动,其实是对开发做分工从而发挥嵌入式的优势.

平台驱动、平台设备主要设及到四个重要的结构体。struct platform_driver,struct platform_device,struct device_driver,struct device。

相关内容