<一>:设备驱动程序的作用

从一个角度看,设备驱动程序的作用在于提供机制,而不是策略。

在编写驱动程序时,程序猿应该特别注意以下这个基本概念:编写訪问硬件的内核代码时,不要给用户强加不论什么特定策略。由于不同的用户有不同的需求,驱动程序应该处理如何使硬件可用的问题。而将如何使用硬件的问题留给上层应用程序。

从还有一个角度来看驱动程序。它还能够看作是应用程序和实际设备之间的一个软件层。

总的来说,驱动程序设计主要还是综合考虑以下三个方面的因素:提供给用户尽量多的选项、编写驱动程序要占用的时间以及尽量保持程序简单而不至于错误丛生。

<二>:内核功能划分

Unix系统支持多进程并发执行。每一个进程都请求系统资源。内核负责处理全部这些请求,依据内核完毕任务的不同,可将内核功能分为例如以下几部分:

1.进程管理:负责创建和销魂进程。并处理它们和外部世界之间的连接。内核进程管理活动就是在单个或多个CPU上实现了多个进程的抽象。

2.内存管理:内存是计算机的主要资源之中的一个,用来管理内存的策略是决定系统系能的一个关键因素。

3.文件系统:内核在没有结构的硬件上构造结构化的文件系统。而文件抽象在整个系统中广泛使用。

4.设备控制:差点儿每个系统操作终于都会映射到物理设备上。

5.网络功能:网络功能也必须由操作系统来管理,系统负责在应用程序和网络接口之间传递数据包,并依据网络活动控制程序的运行。另外。全部的路由和地址解析问题都由内核处理。

可装载模块:Linux有一个非常好的特性:内核提供的特性可在执行时进行扩展。可在执行时加入到内核的代码被称为“模块”。

Linux内核支持几种模块类型。包含但不限于设备驱动程序。

每一个模块由目标代码组成,能够使用insmod程序将模块连接到正在执行的内核,也能够使用rmmod程序移除连接。

<三>:设备和模块的分类

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

1.字符设备:字符设备驱动程序通常至少要实现open、close、read和write系统调用。字符设备能够通过文件系统节点来訪问。

这些设备文件和普通文件之间的唯一区别在于对普通文件的訪问能够前后移动訪问位置。而大多数字符设备是一个仅仅能顺序訪问的数据通道。

2.块设备:和字符设备类似,块设备也是通过/dev文件夹下的文件系统节点来訪问。

块设备上可以容纳文件系统。块设备和字符设备的差别只在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口。而这些不同对用户来讲是透明的。

在内核中,和字符驱动程序相比,块驱动程序具有全然不同的接口。

3.网络接口:网络接口由内核中的网络子系统驱动。负责发送和接受数据包。但它不须要了解每项事务怎样映射到实际传送的数据包。网络驱动程序不须要知道各个连接的相关信息,它仅仅要处理数据包就可以。

内核和网络设备驱动程序间的通信,全然不同于内核和字符以及块驱动程序之间的通信,内核调用一套和数据包传输相关的函数而不是read、write等。

除了设备驱动程序之外。内核中其它一些功能也都模块化了。如文件系统。

一个文件系统类型决定了怎样在块设备上组织数据,以表示文件夹和文件形成的树。文件系统并非设备驱动程序,由于没有不论什么实际物理设备同这样的信息组织方式相关联。相反,文件系统类型是个软件驱动程序。它将底层数据结构映射到高层数据结构。决定文件名称能够多长以及在文件夹项中存储文件的哪些信息等。

<四>:安全问题

1.系统中的全部安全检查都是由内核代码进行的,假设内核有安全漏洞,则整个系统就会有安全漏洞。执行正式公布的内核时,仅仅有超级用户或成为超级用户的入侵者才干使用特权代码。

2.驱动程序编写者应当尽量避免在代码中实现安全策略。

安全策略问题最好在系统管理员的控制之下,在内核的高层来实现。驱动程序编写者还应当避免因为自身原因引入安全方面的缺陷。

3.不论什么从用户进程得到的输入仅仅有经过内核严格验证后才干使用。还要小心对待未初始化的内存:不论什么从内核中得到的内存。都必须在提供给用户进程或者设备之前清零或者以其它方式初始化。否则就可能发生信息泄露。

4.应当小心使用从第三方获得的软件,特别是与内核相关时更是如此,这是由于源码是开放的,每一个人都能够改动和又一次编译它。

5.Linux内核也可编译为不支持模块方式。从而能够关闭不论什么模块相关的安全漏洞。能够通过权能机制禁止在系统启动后转载内核模块。

<五>:版本号编号

1.首先,Linux系统中的每一个软件包都有自己的发行编号,并且它们之间常常存在相互间的依赖关系。

如今差点儿全部的发行版都带有包管理器,它在验证满足包之间的依赖关系后才同意升级包。遇到不论什么版本号相关的问题时,可參考内核源文件Documentation/Changes来解决。

2.对内核来讲,偶数编号的内核版本号是用于正式发行的稳定版本号。而奇数编号的版本号则

是开发过程中的一个快照。

<六>:许可证条款

Linux遵循GNU通用的公共许可证(GPL),GPL同意不论什么人又一次公布甚至销售由GPL条款保护的产品,前提是产品接受者可以获得源代码并拥有相同的权利。

假设想阅读这个许可证原文,可以在系统的内核源代码树顶层文件夹中的COPYING文件里找到它。

LINUX设备驱动程序笔记(一)设备驱动程序简单介绍的更多相关文章

  1. 算法笔记_071:SPFA算法简单介绍(Java)

    目录 1 问题描述 2 解决方案 2.1 具体编码   1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个 ...

  2. Linux系统学习笔记之 1 一个简单的shell程序

    不看笔记,长时间不用自己都忘了,还是得经常看看笔记啊. 一个简单的shell程序 shell结构 1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建shell程序的步骤 第一步: ...

  3. JMeter学习笔记2-图形界面简单介绍

    废话少说直接干活的给: 一.打开和运行JMeter,出现UI界面.如图下所示: 工具栏:常见操作的图标集合,有New(新建), Template(模板) ,Save(保存),Start(开始) ,St ...

  4. Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥

    一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核 ...

  5. linux程序调试命令addr2line之入门简单介绍(本文先不聊gdb调试)

    addr2line有什么作用呢? 可别小瞧它, 它能够定位到代码出错的位置. 以下, 我们来看看这个简单的代码: #include <stdio.h> int main() { int * ...

  6. 项目管理---git----快速使用git笔记(一)------git的简单介绍

    最近svn代码管理服务器崩溃了,切换到git来运作. 经过几天的使用,感觉很不错. 尤其是代码合并到正式版本之前 可以对代码进行 code review. 这样能很好的保证团队的代码质量和一些重复代码 ...

  7. 算法笔记_068:Dijkstra算法简单介绍(Java)

    目录 1 问题描述 2 解决方案 2.1 使用Dijkstra算法得到最短距离示例 2.2 具体编码   1 问题描述 何为Dijkstra算法? Dijkstra算法功能:给出加权连通图中一个顶点, ...

  8. tcp ip协议笔记(1)——简单介绍

    前言 本人记性不佳,看书健忘,以此笔记来记录看书后自己所知所想,已达到加深对tcp ip的理解.本笔记不过我看完书后自己所写的总结,权当是书后复习. 一.为什么会有tcp ip协议        ...

  9. 张高兴的 Xamarin.Forms 开发笔记:TapGestureRecognizer 的简单介绍与应用

    最近很少写应用了,一直在忙关于 ASP.NET 的东西(哈欠...).抽点时间对 TapGestureRecognizer 做点总结. 一.简介 TapGestureRecognizer 就是对 Ta ...

  10. 【Android学习笔记】布局的简单介绍

    我在学习Android开发的时候是基于实战项目的,基础理论知识以前也是零散的看过一些,个人还是觉得边做项目边学要快些.现在做的这个项目iOS端是我做的,这样逻辑什么的都很熟悉,于我而言换个平台也只是换 ...

随机推荐

  1. 手把手教你如何新建scrapy爬虫框架的第一个项目(下)

    前几天小编带大家学会了如何在Scrapy框架下创建属于自己的第一个爬虫项目(上),今天我们进一步深入的了解Scrapy爬虫项目创建,这里以伯乐在线网站的所有文章页为例进行说明. 在我们创建好Scrap ...

  2. 【Paper Reading】Object Recognition from Scale-Invariant Features

    Paper: Object Recognition from Scale-Invariant Features Sorce: http://www.cs.ubc.ca/~lowe/papers/icc ...

  3. mysql日期加减运算

    MySQL 日期类型MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型        存储空间       日期格式                 日期范围 --------- ...

  4. 紫书 例题 11-14 UVa 1279 (动点最小生成树)(详细解释)

    这道题写了好久-- 在三维空间里面有动的点, 然后求有几次最小生成树. 其实很容易发现, 在最小生成树切换的时候,在这个时候一定有两条边相等, 而且等一下更大的那条边在最小生成树中,等一下更小的边不在 ...

  5. Linux split 命令用法详解 - 切割文件[转]

    功能说明:切割文件.语 法:split [--help][--version][-<行数>][-b <字节>][-C <字节>][-l <行数>][要切 ...

  6. Material Design学习之 Button(具体分析,传说中的水滴动画)

    转载请注明出处:王亟亟的大牛之路 上一篇大致介绍了Material Design的一些基本概念传送门:http://blog.csdn.net/ddwhan0123/article/details/5 ...

  7. jquery-easyui的datagrid在checkbox多选时,行选中不正确应,去除高亮的解决方法

    jquery-easyui的datagrid在checkbox多选时,行选中不正确应,去除高亮的解决方法 工作中用到一个具有多选功能的easyui-datagrid在处理cell的点击事件时,不同 ...

  8. 8、java高级面向对象-重载、构造器重载、初始化块、this、super、对象构造和初始化分析、覆盖、toString

    1.方法的重载(overload) 同一个类中同时存在一个以上的同名函数,参数个数或类型不同或顺序不同,称为方法的重载. 和返回值无关! 构造器重载:非默认构造器和默认构造器其实就是方法的重载. 2. ...

  9. SurfaceView左右滑动切换黑屏问题解决方式

    在项目中使用的是高德地图,放置MapView的Fragment和其它Fragment放置一个ViewPager中切换:当从MapView的Fragment切换到其它Fragment或者从其它Fragm ...

  10. 【Android UI】案例02 圆角边框、圆角背景的实现(shape)

    本文主要分享圆角边框与圆角背景的实现方式.该方式的实现,须要了解shape的使用.该部分的具体介绍,请阅读博客http://blog.csdn.net/mahoking/article/details ...