Linux设备驱动开发基础---新驱动程序添加到内核方法(1)

来源:互联网 发布:中国人寿保险网络大学 编辑:程序博客网 时间:2024/05/02 15:03

1、编写Linux设备驱动的技术基础

编写Linux 设备驱动要求工程师具有良好的硬件基础,懂得 SRAM、Flash、SDRAM、磁盘的读写方式,UART、I2C、USB等设备的接口,轮询、中断、DMA的原理,PCI总线的工作方式以及CPU的内存管理单元(MMU)等。  

编写Linux 设备驱动要求工程师具有良好的 C语言基础, 能灵活地运用 C语言的结构体、指针、函数指针及内存动态申请和释放等。 
编写 Linux 设备驱动要求工程师具有一定的 Linux 内核基础,虽然并不要求工程师对内核各个部分有深入的研究,但至少要了解设备驱动与内核的接口,尤其是对于块设备、网络设备、Flash设备、串口设备等复杂设备。 
编写Linux 设备驱动要求工程师具有良好的多任务并发控制和同步的基础,因为在设备驱动中会大量使用自旋锁、互斥、信号量、等待队列等并发与同步机制。 

还需要掌握调试过程中常用仪器、仪表的使用方法,万用表、示波器和逻辑分析仪等。 

2、Linux内核的组成

Linux内核主要由进程调度(SCHED) 、内存管理(MM) 、虚拟文件系统(VFS) 、网络接口(NET)和进程间通信(IPC)等 5 个子系统组成。 

进程调度:精度调度控制系统中的多个进程对 CPU 的访问使得多个进程能在 CPU 中微观串行,宏观并行地执行。

内存管理的主要作用是控制多个进程安全地共享主内存区域。

Linux 虚拟文件系统(VFS)隐藏各种了硬件的具体细节,为所有的设备提供了统一的接口。

网络接口提供了对各种网络的标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。

Linux 支持进程间的多种通信机制,包含信号量、共享内存、管道等,这些机制可协助多个进程、多资源的互斥访问、进程间的同步和消息传递。 

3、应用程序。库、内核、驱动程序的关系

从上到下,一个软件系统可分为:应用程序、库、操作系统、驱动程序。开发人员可以专注于自己熟悉的部分,对于相邻层,只需要了解它的接口,无需专注它的实现细节。

4、设备和模块的分类

Linux系统将设备分成三种基本的类型:字符设备、块设备和网络接口。

5、Linux驱动程序开发步骤

编写一个Linux设备驱动程序的大致流程如下:

(1)查看原理图、数据手册,了解设备的操作方法。

(2)在内核中找到相近的驱动程序,以它为模板进行开发,有时候需要从零开始。

(3)实现驱动程序的初始化。

(4)设计所要实现的操作。

(5)实现终端服务(并不是每个设备驱动所必须的)。

(6)编译该驱动程序并测试。

6、Linux 2.6内核的配置系统由以下3个部分组成。 
 Makefile:分布在  Linux  内核源代码中的  Makefile,定义  Linux  内核的编
译规则。 
配置文件(Kconfig) :给用户提供配置选择的功能。 
配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供字符界面和图形界面) 。

7、Linux内核模块简介

Linux 内核的整体结构非常庞大,其包含的组件也非常多。我们怎样把需要的部分都包含在内核中呢? 

一种方法是把所有需要的功能都编译到 Linux 内核。这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。  

Linux还提供了这样的一种机制,这种机制被称为模块(Module) ,可以实现以上效果。模块具有以下特点: 
模块本身不被编译入内核映像,从而控制了内核的大小。 
模块一旦被加载,它就和内核中的其他部分完全一样。 

在2.6内核中,模块的扩展名为.ko (以hello.ko为例),通过“insmod  ./hello.ko”命令可以加载它,通过“rmmod  hello”命令可以卸载它。通过lsmod命令查看内核中已经加载了那些模块。