Linux驱动开发入门与实战第一章学习笔记
第一章Linux驱动开发概述
1.1Linux设备驱动的基本概念
1.设备驱动程序是一个允许计算机软件硬件交互的程序,不同的平台需要不同的驱动程序。
2.设备驱动程序的作用
a.设备驱动程序相当于硬件的接口,操作系统只有通过接口才能将控制硬件的工作,所以操作系统安装之后首要的便是安装硬件设备的驱动程序。
b.并不是所有的硬件都需要安装驱动程序,但并不是代表这些硬件不需要硬件驱动程序,而是这些驱动已经内置到了操作系统,不同版本的操作系统对硬件设备的支持也不一样,一般版本越高所支持的硬件设备也越多。
c.设备驱动程序用来将硬件本身的功能告诉操作系统(通过提供接口的方式),完成硬件设备电子信号与操作系统及软件高级语言之间的相互翻译。简单来说,驱动程序是提供硬件到操作系统的接口,并协调二者之间的关系。
3.设备驱动的分类
a.字符设备(驱动层)
指哪些能一个字节一个字节读取数据的设备,一般不支持寻址,只能对硬件中的寄存器进行顺序的读取,读取数据后有驱动程序分析需要那一部分数据。
b.块设备
像磁盘一样的设备,每次传输一个或多个块,本质上像一个字符设备的扩展。
c.网络设备
负责主机之间的数据交换;网络设备主要是面向数据包的接受和发送而设计的;网络设备实现了一种套接字的接口,任何网络数据传输都可以通过套接字来完成。
1.2Linux操作系统与驱动的关系
1.用户空间包括应用程序和系统调用两层,应用程序一般依赖于函数库,而函数库由系统调用来编写的,所以应用程序间接依赖于系统调用。
2.系统调用层是内核空间和用户空间的接口层,是操作系统提供给应用程序最底层的API。
3.应用程序需要访问硬件设备,那么应用程序先访问系统调用层,由系统调用层去访问内核层的设备驱动程序。这样的设计保证了各个模块的功能,也保证了系统的安全。
4.设备驱动程序驱动最底层的硬件。
1.3Linux驱动程序开发
1、用户态和内核态
a.Linux操作系统分为用户态和内核态,用户态处理上层软件的工作,内核态用来管理用户态的程序,驱动程序与底层硬件交互,所以工作在内核态。所以内核态大部分时间在完成与硬件的交互。
b.Linux操作系统分为两个状态的原因主要是为应用程序提供一个统一的计算机硬件抽象。
c.处理器提供了特权指令和普通指令,特权指令只用在内核态才有使用,普通指令既可以在内核态使用,也可以在用户态使用。内核态和用户态可以相互转换,应用程序执行系统调用被硬件中断挂起时,Linux操作系统会从用户态切换到内核态,当系统调用完成和中断处理完成后,操作系统会从内核态返回到用户态,继续执行应用程序。
2.模块机制
a.模块是可以在运行时加入内核的代码;
b.模块在内核启动时装载称为静态装载,在内核已经运行时装载称为动态装载。
1.4编写设备驱动程序的注意事项
1.应用程序开发与驱动程序开发的差异
在Linux上的程序开发一般分为两种,一种是内核和驱动程序开发,另一种是应用程序开发,分别对应内核态和用户态;
应用程序开发与驱动程序开发的差异主要包括以下几点:
a.内核及驱动程序开发不能访问C库,不能使用C库开发驱动程序;
b.内核及驱动程序开发必须使用GNU C;
c.内核支持异步中断、抢占、SMP,开发必须注意同步和并发;
d.内核及驱动程序开发应该使用整型数据;
e.内核及驱动程序开发应该考虑可移植性;
f.内核有一个很小的定长堆栈;
***内核程序中的包含的头文件是指内核代码树中的内核头文件,不是指开发应用程序时的外部头文件。
2.没有内存保护机制
要重视对内存的正确访问,建议申请内存后,对返回地址进行检测。
3.小内核栈
内核要求使用固定常驻的内存空间;32位机的内核栈是8KB;64位机的内核栈是16KB.
4.重视可移植性
可移植性实现方式:
a.定义一套可移植的API
b.使用类似Java等可移植到操作系统上的语言;

浙公网安备 33010602011771号