最近一直在看JONATHAN的《linux设备驱动程序》,开始看还觉得可以跟的上作者思路,后面感觉越发吃力。现在想想主要是自己不清楚设备驱动程序的功能作用,导致对驱动程序片面性的界定。想来现在需要跟着作者的思路,才能理清自己的思路。
首先介绍linux设备驱动程序的目录:
第一章:设备驱动程序简介
第二章:构造和运行模块
第三章:字符设备驱动程序
第四章:调试技术
第五章:并发和竞态
第六章:高级字符驱动程序操作
第七章:时间,延迟及延缓操作
第八章:分配内存
第九章:与硬件通信
第十章:中断处理
第十一章:内核的数据类型
第十二章:PCI驱动程序
第十三章:USB驱动程序
第十四章:Linux设备模型
第十五章:内存映射和DMA
第十六章:块设备驱动程序
第十七章:网络驱动程序
第十八章:TTY驱动程序
从目录可以看出,从第二章到第十一章作者除了写关于字符设备的驱动程序之外,并没有立刻对其他设备的驱动程序做分析。但是这些章节的内容却是非常重要。
第二章提供的是所有模块共享的基本代码,这些技巧是编写任何模块化驱动程序的基础。
大多数小规模及中规模应用程序是从头到尾执行单个任务,而模块却只是预先注册自己,以便服务于将来的某个请求,然后它的初始化函数就立即结束。模块的初始化函数的任务就是为以后调用模块函数预先做准备。----------------模块的概念
每当应用程序执行系统调用或者被硬件中断挂起,Unix将执行模式从用户空间切换到内核空间。执行系统调用的内核代码运行在进程上下文中,它代表调用进程执行操作,因此可以访问进程地址空间的所有数据。而处理硬件中断的内核代码和进程是异步的,与任何特定的进程无关。模块化代码在内核空间中运行,用于扩展内核的功能。通常,一个驱动程序要执行先前讲述过的两类任务:模块中的某些函数作为系统调用的一部分而执行,而其他函数则负责中断处理。--------------------------------------用户空间与内核空间
内核编程必须时刻考虑到并发问题。Linux系统通常运行几个并发进程,并且可能有多个进程同时使用我们的驱动程序。其次大多数设备能够中断处理器,而中断处理程序是异步的,而且可能在驱动程序正试图处理其他任务时被调用。Linux还可以运行在SMP系统上,意味着可能不止一个CPU运行我们的驱动程序。------------------------------------------------------内核中的并发
第二章还有一个hello world示例,意在介绍如何将模块源代码编译成能够装载到内核中的可执行模块。
第二章在讲述构造和运行模块的时候,逐渐向我们提出一些需要注意的问题,比如注册,并发和竞态,内核进程异步,硬件中断。这些问题都必须要很好的解决,否则很容易造成系统问题。
阅读(1271) | 评论(0) | 转发(0) |