设备驱动程序的简介

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、驱动的概念

设备驱动程序(Device Driver),简称驱动程序、驱动(Driver),指操作系统中用来操控硬件的代码。

驱动是硬件与操作系统之间的接口,操作系统只有通过这个接口才能控制硬件设备的工作,因此驱动程序被誉为“硬件的灵魂”、“硬件的主宰”和“硬件和系统之间的桥梁”等。


二、驱动的层次与框架

1、驱动的层次

Linux的体系架构体现着分层的思想。对于驱动层,它上面是系统调用,下面是硬件层。

2、驱动的框架

驱动本身也是分层的,这体现为驱动的框架。内核驱动维护者往往为同类的设备设计了一个框架,框架的核心层实现了该设备通用的一些功能,而具体的底层操作留给驱动工程师去实现。更多描述见博文:什么是驱动框架?_天糊土的博客-CSDN博客。

三、驱动的模块化设计

1、宏内核与微内核

(1)宏内核的含义

将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。

所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。

(2)微内核的含义

功能被划分成独立的过程,过程间通过IPC进行通信。

模块化程度高,一个服务失效不会影响另外一个服务。

典型如windows。

2、Linux的宏、微内核属性

Linux本质是宏内核,但是吸收了微内核的模块化特性,体现在以下方面:

(1)静态模块化

在编译时可进行配置,以达到功能裁剪的目的,但是想要功能裁剪改变必须重新编译。

(2)动态模块化

不需要重新编译与烧录内核源码镜像,甚至可以不关机重启,就能实现模块的安装与卸载。


四、驱动分类

计算机系统的主要硬件由CPU、存储器和外部设备组成。

驱动程序的对象一般是存储器和外部设备。根据这些设备本身读写操作的特征差异,驱动分为以下三类:

1、字符设备驱动

字符设备,或者说“字节设备”,指的是以字节为单位进行操作的设备。

多数的设备属于字符设备,如LCD、串口、LED、蜂鸣器、触摸屏、鼠标、键盘等等。

内核为每个字符设备设计了一个文件(叫做字符设备文件),表现为/dev/xxx。对字符设备文件的操作,会映射为对字符设备的操作。

字符设备一般需要在驱动层实现open()、close()、read()、write()、ioctl()等函数。这些函数最终将被文件系统中的相关函数调用。

2、块设备驱动

块设备是相对于字符设备定义的,块设备被软件操作时是以块为单位的。

设备的块大小是设备本身设计时定义好的,软件不能更改,不同设备的块大小可以不一样。

常见的块设备都是存储类设备,如硬盘、iNand、SD等等。

3、网络设备驱动

Linux中网络设备驱动主要目的是为了支持API中socket相关函数的工作。


五、驱动程序的安全性要求

1、驱动对内核的影响

驱动是内核的一部分,而且是内核中最庞大的组成部分。内核以函数调用的方式调用驱动代码,驱动代码崩溃甚至会导致内核崩溃,驱动的效率会影响内核的整体效率,驱动的漏洞会造成内核安全漏洞。

2、常见驱动安全性问题

(1)未初始化指针

(2)恶意用户程序

(3)缓冲区溢出

(4)竞争状态

六、驱动开发与应用开发的差异

1、内核及驱动程序开发时不能访问C库。因为C库是使用内核中的系统调用来实现的,而且是在用户空间实现的。

2、内核及驱动程序开发时必须使用GNU C,因为Linux从一开始就使用GNU C。

3、内核支持异步终端、抢占和SMP,故必须注意同步和并发。

4、内核只有一个很小的定长堆栈。

5、内核及驱动程序开发时缺乏像用户空间那样的内存保护机制。

6、内核及驱动程序开发时浮点数很难使用,应该使用整形数。

7、内核及驱动程序开发要考虑可移植性。


七、驱动学习方法

1、基础积累

(1)熟悉C语言。

(2)对芯片手册上描述的接口设备有清楚的认识。比如SRAM、Flash、UART、IIC、USB等。

(3)掌握系统编程,比如多任务程序设计。

2、驱动学习阶段

(1)注重实践,一步一步写驱动。

(2)培养框架思维,多考虑整体和上下层。

(3)通过简单设备学Linux驱动框架。

(4)学会总结、记录,这会有助于理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开发实践:掌握Camera的预览方向和拍照方向

Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向,本文就重点讨论一下这个问题。图像的Sensor方向:手机Camera的图像数据都是来自于摄像头硬件的图像传感器(Image Sensor&…

mknod命令:创建设备文件

参考博客:mknod_liangkaiming的博客-CSDN博客 参考资料:man手册 可以通过man 1 mknod查看mknod命令的内容。 1、mknod 命令的作用是make block or character special files,即创建块设备或者字符设备文件。 2、mknod 命令的格式是&#xf…

DreamWeaver使用技巧学习心得

全是我在平时学习网页时积累的,觉得会对遇到同样问题的友人有帮助,都是一些觉得困惑好久然后豁然开朗的心得。 希望大家都能体会到,解决难题后的快乐。 都是我恍然大悟的地方,不够恍然大悟的就不贴上来了。 1.让一个区块居中&…

【转】每天一个linux命令(39):grep 命令

原文网址:http://www.cnblogs.com/peida/archive/2012/12/17/2821195.html Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全…

SecureCRT显示乱码的解决办法

发现问题 在Ubuntu中编写代码,输出语句里带有中文,比如"printf("读出来的内容是:%s.\n", buf);"。使用交叉编译工具链编译后,将可执行程序转移至开发板系统运行,并使用SCRT来观测测试结果。此时发…

WCF数据契约

当使用DataMember时,和访问符无关,及时使用了private,成员都是可见的。相反如果使用static,为不可见。 上述的两个数据成员是等效的,如果是等效的话 数据成员的顺序也必须是相同的。 4.数据契约已知类型——使用KownTy…

Linux中NFS服务器的配置(/etc/export)

本文转载于NFS /etc/exports参数解释,有修改。 问题引入 之前利用NFS从ubuntu中下载根文件系统到开发板(见博客以NFS方式挂载rootfs的设置方法),但只是遵照教程安装的,对里面的设置含义不是很清楚。后来在开发板上上进…

cocos2d 很水很水的看法

这几天接了个扯淡的项目 cocos2d的 。 本来以为是Cpp的, 结果不是2dx ,而是OC的2d。看了几天的官方的dome ,大概知道是什么样子的。我就简单的纪录一下好了: cocos2d的整个框架呢, 分为3层 — 类似舞台剧 演戏嘛 肯定有个boss的 …

详解EBS接口开发之采购申请导入

更多内容可以参考我的博客 详解EBS接口开发之采购订单导入 http://blog.csdn.net/cai_xingyun/article/details/17114697 /*--将数据写入至采购申请接口表*/PROCEDURE insert_procure_main(errbuf OUT NOCOPY VARCHAR2,retcode OUT NOCOPY VARCHAR2)…

sys文件系统

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 前言 Linux2.6版本的内核引入了sys文件系统。 在 proc文件系统介绍和使用 中,介绍了sys文件系统与proc文件系统的差异。它们都是虚拟文件系统,都是内核中的数据结构的可视化接口。它…

spring mvc 配置解析之xml

2019独角兽企业重金招聘Python工程师标准>>> ##mvc.xml中可配置的元素## 既然是xml,当然是要遵循schema的规定. 那么schema文件在哪呢? 定位方法就是解开这个jar文件,找到META-INF/spring.schema文件,这是个文本文件,里面包含了namespace以及其对应的xsd文件的位置…

IOS-UITextField类

文字属性 text placeholder   //默认使用70%灰色 font textColor textAlignment 文字大小 adjustsFontSizeToFitWidth minimumFontSize 编辑行为 editing     //是否正在编辑(read-only) clearsOnBeginEditing 展现形态 borderStyle     //默认UITextBord…

tree命令:以树的形式列出目录中的文件

在linux命令行中,输入“man 1 tree”可以得知tree命令的用法。 这里讲解几个常用的选项。 tree -L level_num :Max display depth of the directory tree. 比如“tree -L 1”,表示深度为1层。 rootubuntu:/sys# ls block bus class de…

JDBC学习笔记——事务、存储过程以及批量处理

2019独角兽企业重金招聘Python工程师标准>>> 1、事务 1.1、事务的基本概念和使用示例 数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完整…

验证码识别笔记(二)

这是验证码识别的第二篇,先看一下样图吧,就是下面那张。 看到这张图片,直观上就知道比第一篇中的要简单,这个“简单”用语言来描述,可以得到下面的几条结论: 1. 图片中的字符边界比较清晰,并且单…

dd命令:用于读取、转换并输出数据

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 命令作用 从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。 参数说明 if文件名:输入文件名,默认为标准输入。即指定源文…

centos6.5下搭建oracle 11g

为什么80%的码农都做不了架构师?>>> 安装依赖 yum install binutils compat-libstdc-33 compat-libstdc-33.i686 \ elfutils-libelf elfutils-libelf-devel gcc gcc-c glibc glibc.i686 \ glibc-common glibc-devel glibc-devel.i686 glibc-headers ksh…

Unix基本系统数据类型和stat结构体

Unix基本系统数据类型 历史上,某些UNIX变量已与某些C数据类型联系在一起,例如,历史上主、次设备号存放在一个1 6位的短整型中, 8位表示主设备号,另外8位表示次设备号。但是,很多较大的系统需要用多于256个值…

回环设备(/dev/loop*)与losetup命令

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 一、前言 之前曾利用losetup命令进行根文件系统镜像文件的制作,但不明白其命令含义。 二、回环设备 命名方式 回环设备一般以 /dev/loop* 方式命名。 回环设备的含义 回环设备是一种伪设备&#…

oracle中游标的使用

1)--- 使用带参数的游标;declareCURSOR stock_cur(symbol_in VARCHAR2) IS SELECT * FROM rate_combine_nr nr WHERE nr.combine_nosymbol_in;stock_info stock_cur%ROWTYPE; beginOPEN stock_cur(G600000001); --打开游标;loop FETCH stock_cur INTO stock_inf…