1.驱动应该怎么学

版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/82914977

1.什么是驱动?

驱动就是硬件和应用软件之间的纽带

1.1、理解驱动的概念

驱动字面意思:驱使硬件设备行动

1.  无操作系统时的设备驱动
    并不是任何一个计算机系统都一定要有操作系统,在许多情况下,操作系统都不必存在。对于功能比较单一、控制并不复杂的系统,譬如 ASIC 内部、公交车的刷卡机、电冰箱、微波炉、简单的手机和小灵通等,并不需要多任务调度、文件系统、内存管理等复杂功能,用单任务架构完全可以良好地支持它们的工作。
如何实现:

设备驱动的接口(即函数)被直接提交给应用软件工程师,应用软件和驱动之间没有系统调用。

2.有操作系统时的设备驱动

这样的驱动制造起来麻烦,但却给上层应用提供便利。

1.2、linux体系架构

(1)分层思想
(2)驱动的上面是系统调用API
(3)驱动的下面是硬件
(4)驱动自己本身也是分层的

2.Linux 设备驱动与整个软硬件系统的关系

除网络设备外,字符设备与块设备都被映射到 Linux 文件系统的文件和目录

通过文件系统的系统调用接口 open()、 write()、 read()、 close() 等即可访问字符设备和块设备。

所有字符设备和块设备都统一呈现给用户。

Linux 的块设备有两种访问方法:

  1. 类似 dd 命令对应的原始块设备,如“/dev/sdb1”等;
  2. 在块设备上建立FAT、 EXT4、 BTRFS 等文件系统,然后以文件路径如“/home/barry/hello.txt”的形式进行访问。

                                        Linux 设备驱动与整个软硬件系统的关系

3.模块化设计

3.1、微内核和宏内核
(1)宏内核(又称为单内核):将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。
(2)微内核:功能被划分成独立的过程,过程间通过IPC进行通信。模块化程度高,一个服务失效不会影响另外一个服务。典型如windows
(3)linux:本质上是宏内核,但是又吸收了微内核的模块化特性,提现在2个层面
3.2、静态模块化:在编译时实现可裁剪,特征是想要功能裁剪改变必须重新编译
3.3、动态模块化:zImage可以不重新编译烧录,甚至可以不关机重启就实现模块的安装和卸载。

内核模块的好处:

  1. 在需要的时候动态的加载到内核,从而增加内核的功能。
  2. 在不需要的时候可以动态的卸载,从而增加内核的功能,并节省内核空间
  3. 而不论加载和卸载驱动程序,都不用重启整个系统
  4. 驱动的单独编译,单独单独的加入内核

4.linux设备驱动分类

4.1、驱动分类

(1)分3类:字符设备驱动、块设备驱动、网络设备驱动
(2)分类原则:设备本身读写操作的特征差异


4.2、三类驱动程序详细对比分析

(1)字符设备

准确的说应该叫“字节设备”,软件操作设备时是以字节为单位进行的。典型的如LCD、串口、LED、蜂鸣器、触摸屏······
(2)块设备

块设备是相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。设备的块大小是设备本身设计时定义好的,软件是不能去更改的,不同设备的块大小可以不一样。常见的块设备都是存储类设备,如:硬盘、NandFlash、iNand、SD····
(3)网络设备

网络设备是专为网卡设计的驱动模型,linux中网络设备驱动主要目的是为了支持API中socket相关的那些函数工作。

4.3、为什么字符设备驱动最重要

(1)常见大量设备都属于字符设备
(2)举例说明非标准类型字符设备驱动

5.驱动程序的安全性要求

5.1、驱动是内核的一部分

(1)驱动已经成为内核中最庞大的组成部分
(2)内核会直接以函数调用的方式调用驱动代码
(3)驱动的动态安装和卸载都会“更改”内核


5.2、驱动对内核的影响

(1)驱动程序崩溃甚至会导致内核崩溃
(2)驱动的效率会影响内核的整体效率
(3)驱动的漏洞会造成内核安全漏洞


5.3、常见驱动安全性问题

(1)未初始化指针
(2)恶意用户程序
(3)缓冲区溢出
(4)竞争状态

6.驱动应该这么学

6.1、先学好C语言
6.2、掌握相关预备知识

(1)硬件操作方面
(2)应用层API


6.3、驱动学习阶段

(1)注重实践,一步一步写驱动
(2)框架思维,多考虑整体和上下层
(3)先通过简单设备学linux驱动框架
(4)学会总结、记录,这会有助于理解


Linux编码风格:

https://www.kernel.org/doc/html/latest/translations/zh_CN/coding-style.html

猜你喜欢

转载自blog.csdn.net/qq_40732350/article/details/82914977