linux驱动程序中,难点其实是概念,例如驱动程序是如何工作的,内核为驱动程序提供了哪些设施,哪些接口,如果概念很清晰,程序写起来不是很难,往往是移植别人的,有点像填空题,这可能是我作为初学者的想法,欢迎批评,呵呵。所以首先,我谈谈理论,个人比较喜欢研究理论,分析代码是没办法的事情,这里我想到哪写到哪里,会不断更新。理论这东西,比较容易搞混,不像代码对就是对,错就是错,泾渭分明。哪里说得不对,及时提醒,不甚感激,以免误导别人。
linux驱动程序有什么作用呢?linux驱动程序是联系内核和硬件的桥梁。好像很晦涩。我们考虑下硬件上不运行操作系统的情况,这种情况下,合理的程序也会存在驱动程序(我们往往实现为库代码),以供应用程序调用,这样做的好处是应用程序工程师不必考虑复杂寄存器,内存等操作,而更专注于一些算法和功能的实现。在裸机下存在一个明显的缺点,就是不同工程师的硬件驱动程序接口可能不一样,没有一个统一的标准,很难移植。而linux帮我们很好的解决了这一问题,驱动程序不直接为应用程序服务了,它为内核服务,而应用工程师看到的是linux为我们提供的统一的接口。可以这样简单理解:在跑裸机的时候,驱动程序是应用程序和硬件的桥梁;在linux系统中,驱动程序是联系内核和硬件的桥梁,应用程序使用内核提供的统一的接口。
什么内核模块?模块是可以动态加载和卸载的代码段。我们的驱动程序写完后即可编译成内核模块,根据需要加载或卸载,这样可以大幅节省开发时间;亦可以编译进内核,但必须忍受编译内核所耗费的时间。模块和驱动没有什么直接的联系。linux是模块化的内核,linux的很多子系统是以模块的形式存在的,方便用时加载,驱动只是一部分。
内核源码树,最先看linxu驱动的时候,尤其是ldd,在开头阶段多次提到内核源码树。对于初学者,可能不太乐意编译内核之类的,但我感觉那是步入驱动开发的必经之路。其实,内核源码树可以简单的理解为内核源码。ldd中提到,在2.6的内核中,我们应该首先构造一个内核源码树,最好是自己下载的标准内核。因为现在的发行版很多只提供了头文件(2.6的内核中,模块需要和源码树中的目标文件连接),而且发行版的内核还可能是修改过的,内核提供部分接口可能有所变化。
理解几种上下文:这是驱动中经常提到的,无法逃避的,还是先看看,虽然很晦涩难懂。
进程上下文,内核态,内核代表进程执行,通过系统调用陷入。
中断上下文,内核态,通过中断进入,内核处理硬件中断和软件中断时就是这种情况。
这两个还好理解,在ldd3的后面还有一个原子上下文,顾名思义,在原子上下文中不可调度。原子上下文应该包括中断上下文和拥有自旋锁(关闭了内核抢占)的进程上下文。原子上下文概念和范围更大一些。理解这些是理解后面并发处理的前提。
阅读(1618) | 评论(1) | 转发(1) |