您的位置:首页 > 运维架构 > Linux

Linux驱动-思想先行事半功倍

2014-05-23 15:00 204 查看
如题所示,写了“思想先行事半功倍”,什么是设备驱动、设备驱动模型如何、怎么写设备驱动?围绕这三个问题,本文小作讨论。

什么是设备驱动?

问题很简单,很多人都会回答,驱动是沟通硬件与软件的桥梁,驱动是驱使设备按一定规则运转的程序。

理解了汇编语言控制寄存器,从而控制CPU这种编程模型,就很容易理解通过程序控制设备相关寄存器,从而控制设备。

驱动就是按照这种逻辑来控制设备的,它分为无操作系统下的驱动、和有操作系统下的驱动。

对于前者驱动需要尽量去抽象对寄存器控制的操作,从而提供接口给应用层使用,应用开发者往往能看到驱动源代码,感知硬件被控制的过程。

对于后者驱动除了要对硬件行为进行抽象提供应用接口以外,还要按照内核的接口标准嵌入到内核中。

设备驱动模型如何?

驱动逻辑模型:设备 + 总线 + 驱动  

        这种方式来组织设备驱动,设备与驱动必须是分离的。设备是设备,驱动是驱动,一个设备换了平台、换了硬件环境,驱动必须不用修改一行代码也能使用,而变化的应该是设备(程序中描述的设备所处环境的变化)。在板级支持包里面,有设备相关属性的描述,所有跟设备所处环境、平台相关的属性,都应该写到设备当中,例如GPIO引脚等。驱动只有跟设备匹配才能运行??????为什么能匹配

驱动层次模型:设备(硬件)->设备操作->核心层驱动->上层接口

        除了设备是指硬件实体以外,后面都是指软件程序。设备操作包括设备的上电、初始化、模式等等操作,这一点和裸机下的驱动类似。Linux当中规定了设备驱动和上层的接口,所有的设备驱动都必须向内核中注册设备文件、以及文件操作给上层,同时这种设备文件的属性和操作必须按照Linux内核标准来编写。

       Linux内核中大量重要面向对象思想,此处设备文件的标准规定,也就是面向对象中的面向接口编程。接口是通用的,这样Linux内核用户空间才能不依赖与下层。

       读系统代码,很大一部分时间就是要去了解层次之间规定的标准。

       “核心层驱动”主要是向上层注册设备文件,当然工作是由“设备操作”驱动中调用核心层来实现的,只不过核心层中写好了标准。

       最后,无操作系统的驱动只需要编写“设备操作”,而有操作系统的驱动需要了解“核心驱动层”,从而将“设备操作”注册到内核中。

驱动理念: 主机驱动 + 从机驱动

        这里的描述是指主机驱动和从机驱动需要分离。若不分离,1个i2c主机对n个i2c从机设备,每写一个从机驱动,都需要去包含主机驱动,这样大大增加了模块的耦合,不利于分析设计,也会编写很多重复代码从而造成困扰。

怎么写设备驱动?

        内核模块,内核把功能相关的一部分代码组织成为模块。Linux内核为放方便管理程序,提出了模块化思想。

        模块不是驱动,驱动也不是模块,当时把某一个设备的驱动代码都写到模块当中就很好,因为这个模块中的逻辑都和这个设备相关。

        学会写内核模块是学会写驱动的基础。同时内核模块可以选择“被编译进内核、不编译、模块化”,其中模块化是指模块编译成链接库,被动态链接。

        设备被分为:字符设备、块设备、网络设备。现实工程中的设备往往看不到他们的影子,是因为上文描述的“设备(硬件)->设备操作->核心层驱动->上层接口”这种层次模型存在,工程师们做的是编写“设备操作”相关内容,而设备注册相关内核在“核心驱动层”。 ps:去腾讯面试,这里没搞清楚,被鄙视了!

        因此,学些设备驱动的基础是:练习写字符设备等简单的驱动 + 知道如何控制设备寄存器。

        当这远远不够,远远不够,因为需要了解Linux驱动的架构、需要了解Linux内核、操作系统相关理念(推荐《深入理解计算机系统》) 。

        只有了解这些,动手写驱动才算真的写驱动,连别人的框架都不了解,你要去创造、修改不是瞎搞吗?


        所以,你在写驱动之前,这一件事同样需要你耗费时间去考虑:   我理解内核吗,我理解驱动框架吗?

        假设你有深厚的计算机素养,对内核有一定的理解,了解驱动的框架,再来写驱动应该效果会更好。

        结论:没有经过推到得出来的结论,写设备驱动之前先了解Linux内核理念、学习驱动框架!!!!!!!

        

        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: