1.驱动应该怎么学

 

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

宏内核:其模块间的通讯是通过直接调用其他模块中的函数实现的

微内核:是消息传递。

区别:

宏内核与微内核_Windows

1.宏内核几乎包含了所有功能,微内核之包含了部分

2.宏内核模块依赖较强,例如linux去掉网络,会引发问题,正因为宏内核的这一个缺点,导致了一些问题:例如:要加强安全模块,就要更改所有的模块。

微内核:内核态只保留了最基本的功能:cpu调度,内存管理,进程通信。将文件系统驱动设备放在了外面。

3.宏内核的代码可以用百万来计,微内核可以只有几万,几十万。代码量越大bug越多。

4.微内核的操作系统:windows NT 7 8  ,minix, maxcOS ,WindowsBarrelfish

 宏内核:linux unix

二、微内核的优点

(1) 可伸缩性好,  能适应硬件更新和应用变化
(2) 可移植性好,   所有与具体机器特征相关的代码,全部隔离在微内核中。如果操作系统要移植到不同的硬件平台上, 只需修改微内核中极少量的代码即可
(3) 实时性好,   微内核可以更有效地支持实时处理
(4) 安全可靠性高,   微内核将安全性作为系统内部特性进行设计,对外仅使用少量应用编程接口
(5) 支持分布式系统,  支持多处理机的体系结构  和  高度并行的应用程序
(6) 真正面向对象的操作系统,能显著减小系统开销,  提高系统的正确性、可靠性和易扩展性

 

Linux内核是微内核和单一内核的混合产物相同。

Linux虽是宏内核,但已吸收了微内核的部分精华。Linux是模块化的、多线程的、内核本身可调度的系统,既吸收了微内核的精华,又保留了宏内核的优点,无需消息传递,避免性能损失。

 


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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值