深入理解linux设备驱动程序


1 设备驱动程序简介

设备驱动程序就是进入Linux这类开源操作系统内核的入口

大多数编程问题可以实际分为两部分:“需要提供什么样的功能”(机制),“如何使用这些功能”(策略)。前者对应驱动程序,后者对应应用程序。应该尽可能让驱动程序不带策略。

不带策略的驱动程序包含下列的典型特征:

  • 同时支持同步和异步操作
  • 能够被多次打开
  • 充分利用硬件特性
  • 不具备用来"简化任务"的或提供策略相关的软件层。

1.1 内核功能划分

内核功能划分

  • 进程管理:创建和销毁进程,处理与外部世界之间的连接(输入输出)。
  • 内存管理: 虚拟地址空间
  • 文件系统: 没有结构的硬件上构造结构化的文件系统,支持多种文件系统类型(物理介质上组织数据的不同方式)
  • 设备控制: 为每个外设嵌入相应的驱动程序
  • 网络功能: 在应用程序和网络接口之间传递数据包,并根据网络活动控制程序的执行。

1.2 可装载模块

内核提供的特性可以在运行时进行扩展,在运行时添加到内核中的代码被称为模块。每个模块由目标代码组成,使用insmod连接到正在运行的内核,rmmod移除连接。

1.3 设备和模块的分类

Linux系统将设备分成3中基本类型: 字符设备块设备网络设备

  • 字符设备: 能够像字节流一样被访问的设备,至少要实现open,close,readwrite系统调用。比如/dev/console(字符终端)和/dev/ttys0(串口)。和普通文件的区别是大部分只能顺序访问数据。
  • 块设备: 每次只能传输一个或多个完整的,每块包含512字节或更多,但linux也可以像字符设备一样读取数据,区别在于内核管理数据的方式(内核与驱动程序之间的接口)
  • 网络接口: 由内核中的网络子系统驱动,负责发送和接收数据包,名字为eth0,但是在文件系统中不存在对应的节点。

根据支持给定类型设备来划分可以分为:通用串行总线(USB) 模块,串行橾块,SCSI块

1.4 安全问题

系统调用init_module会检查调用进程是否具有将模块装载到内核的权利。

不要运行一个预先编译好的不熟悉的内核。

1.5 版本编号

内核版本为x.x.x,其中第1位数字为主版本号,重大变化时才修改,。第2位数字为次版本号,偶数为稳定版,奇数为开发过程的一个快照,第3位数字为修订版本。

1.6 许可证条款

Linux内核遵循GNU通用公共许可证(GPL)。GPL允许用户自由使用,修改和分发软件,但是分发时必须附带源代码。GPL允许用户在遵循GPL条款的情况下,将软件作为商业产品进行销售。

1.7 Linux内核邮件列表(LKML)

Linux kernel是由分布在世界各地的大牛们共同开发、维护的,这就需要一种交流工具,这种工具就是LKML。因而LKML主要有如下功能:

  • patch的提交、审查
  • patch、版本等发布公告
  • 技术讨论、辩论
  • 打口水仗
    LKML地址

文章作者: sdj
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 sdj !
  目录