Linux学习笔记(三)-设备管理与驱动
来源:互联网 发布:淘宝首页全屏海报尺寸 编辑:程序博客网 时间:2024/06/05 10:47
设备管理与驱动
一. 设备分类:字符设备、块设备、特殊设备
1. 字符设备
- 是指每次与系统传输1个字符的设备
- 字符设备通常为传真、虚拟终端和串口调制解调器、键盘之类设备提供流通信服务
- 字符设备在实现时,大多不使用缓存器。系统直接从设备读取或者写入每一个字符
- 例如,键盘这种设备提供的就是一个数据流,当你敲入“abcdefg这个字符串时,键盘驱动程序会按照和输入完全相同的顺序返回这个由七个字符组成的数据流。它们是顺序的,先返回a,最后是g
2. 块设备
- 是指与系统间用块的方式移动数据的设备。如硬盘、CD-ROM和内存区域
- 块设备通常支持随机存取和寻址,并使用缓存器
- 操作系统为输入输出分配了缓存以存储一块数据。当程序向设备发送了读取或者写入数据的请求时,系统把数据中的每一个字符存储在适当的缓存中
- 当缓存被填满时,会采取适当的操作(把数据传走),而后系统清空缓存
- 它与字符设备不同之处就是其一般支持随机存储,而字符型是流形式,逐一存储
3. 特殊设备(伪设备)
- 在类Unix操作系统中,设备节点并不一定要对应物理设备
- 没有这种对应关系的设备是特殊设备(或伪设备)。操作系统运用了它们提供的多种功能
- 部份经常使用到的特殊设备(或伪设备)包括: null, zero, full, loop
3.1. /dev/stdin:指的就是键盘设备
实验1:#cat > file1 < /dev/stdinTestCtrl +d#cat从/dev/stdin获得数据,然后保存到file1文件中。#cat file1Test实验2:#cat > file1TestCtrl+D#不指定输入,默认的输入设备就是/dev/stdin
3.2. /dev/null设备
- 是个黑洞设备,它丢弃一切写入其中数据,空设备通常被用于丢弃不需要的输出流
- 任何写入该设备数据都会被丢弃掉。从这个里面读取数据返回是空。将一些不用内容经常发送给这个设备,丢弃不需要的数
#cat /dev/null #cat test.sh >/dev/null //读该设备为空,写入改设备的数据都丢弃了
3.3. /dev/zero设备
- /dev/zero 会提供无限的空字符(NULL, ASCII NUL, 0x00)。其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件
//创建一个大小为1M文件,该文件一个块是1024字节,一共是1024块(刚好1M),用/dev/zero文件内容填充它。输出创建到:testzero文件 # dd if=/dev/zero of=testzero count=1024 bs=1024 1024+0 records in 1024+0 records out 1048576 bytes (1.0 MB) copied, 0.0107194 seconds, 97.8 MB/s//这个命令一定不要随便用,有点象windows里面的粉碎文件工具。不过它是用\0x00填充整个分区。这样做数据是不可以恢复的了# dd if=/dev/zero of=/dev/磁盘分区
注意:在linux操作系统中,如果没有资源配额限制,一个普通用户就可以通过上面方法在短时间内将整个磁盘空间占用。也可以通过while(true) {fork……}类程序,启动无限线程,耗尽整个系统内存
3.4. /dev/full设备
- 类Unix系统中,/dev/full(常满设备)是一个特殊设备文件,总是在向其写入时返回设备无剩余空间
- 这个设备通常被用来测试程序在遇到磁盘无剩余空间错误时的行为
# echo 'chengmo' >/dev/full-bash: echo: write error: 设备上没有空间# echo $?1//命令执行返回错误//$?显示最后命令的退出状态。0表示没有错误,其它任何值表明有错误
命令补充:dd命令
- dd命令的用途把指定的输入文件拷贝到指定的输出文件中,并且在拷贝的过程中可以进行格式转换
- 一般用于数据备份与恢复
例1:将本地的/dev/hdx整盘备份到/dev/hdy :#dd if=/dev/hdx of=/dev/hdy例2:将/dev/sda1全盘数据备份到指定路径的image文件:#dd if=/dev/sda1 of=/home/apple/test例3:将备份文件恢复到指定盘:#dd if =/home/apple/test of=/dev/hdx
二. Linux下的设备驱动
1. 设备驱动
- 每个物理设备都拥有自己的控制器。且硬件控制器一般有各自的控制状态寄存器(CSR)。这些寄存器用来启动、停止、初始化设备以及对设备进行诊断
- Linux 中的设备由内核统一管理,这些处理和管理硬件控制器的软件就是设备驱动程序
- 这些设备驱动程序运行在特权优先级上,驻留在内存,负责对底层硬件进行处理
1.1. 主要功能
- 使设备投入运行和退出服务;
- 从设备接收数据并将它们送回内核;
- 将数据从内核送到设备;
- 检测和处理设备出现的错误。
1.2. 特性
a. 驱动程序属于内核代码
设备驱动程序是内核的一部分,它像内核中其它代码一样运行在内核模式,驱动程序如果出错将会使操作系统受到严重破坏,甚至能使系统崩溃并导致文件系统的破坏和数据丢失
b. 为内核提供统一的接口
设备驱动程序必须为 Linux 内核或其它子系统提供一个标准的接口。例如终端驱动程序为Linux 内核提供了一个文件 I/O 接口
c. 驱动程序的执行是属于内核机制并且使用内核服务
设备驱动可以使用标准的内核服务如内存分配、中断发送和等待队列等等
d. 动态可加载
多数 Linux 设备驱动程序可以在内核模块发出加载请求时加载,而不再使用时将其卸载。这样内核能有效地利用系统资源
e. 可配置
Linux 设备驱动程序可以连接到内核中。当内核被编译时,被连入内核的设备驱动程序是可配置的
1.3. 内核和模块
- Linux下硬件的驱动可以有两种方式:
- 直接加载到内核代码中,启动内核时就会驱动此硬件设备
- 另一种就是以模块方式,编译生成一个.o文件。当应用程序需要时再加载进内核空间运行。所以我们所说的一个硬件的驱动程序,通常指的就是一个驱动模块
模块(module)是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。模块最主要的用处就是用来实现设备驱动程序
1.4. 设备文件
- 设备管理的一个基本特征是设备处理的抽象性,即所有硬件设备都被看成普通文件
- 可以通过用操纵普通文件相同的系统调用来打开、关闭、读取和写入设备
- 对于一个物理设备,它可以在/dev下面存在一个或者多个对应的逻辑设备节点,这个节点以文件的形式存在,但它不是普通意义上的文件,它是设备文件,更确切的说,它是设备节点。例如系统中第一个IDE硬盘被表示成/dev/hda。
- 设备一般有主设备号和次设备号
主设备号表明了某一类设备,一般对应着确定的驱动程序;主设备号是从/proc/devices文件中获得的
- 主设备号的主要作用:就是声明设备所使用的驱动程序。驱动程序和设备号是一一对应的,当你打开一个设备文件时,操作系统就已经知道这个设备所对应的驱动程序
次设备号一般是区分不同属性,例如不同的使用方法,不同的位置,不同的操作
2.例子:U盘的访问
2.1 U盘在访问之前一般需要mount,mount 的语法是
#mount 设备名 挂载点目录
2.2 但如何知道u盘的设备名?方法是:可以在插入u盘后用#fdisk -l看一下
2.3 在非虚拟机环境下,插入U盘或存储卡后,就会发现系统中多了一个SCSI硬盘,通过正确地mount它,就可以使用了。例如:
#mount /dev/sda1 /mnt 或 #mount /dev/sda /mnt
然后,可以进入到这个目录/dev/sda1下查看u盘内容
2.4 而在虚拟机环境中,一般在插入U盘后,会自动mount。
例如其对应关系为:
设备名:/dev/sdb1 挂载目录:/media/KINGSTON
然后,可以进入到这个目录/media/KINGSTON下查看u盘内容
- Linux学习笔记(三)-设备管理与驱动
- linux 驱动笔记(三)
- Linux设备与驱动学习笔记(概述)
- [linux驱动]linux块设备学习笔记(三)
- 学习笔记——设备管理
- 嵌入式Linux学习《五》 设备管理
- input子系统——linux驱动学习笔记(三)
- input子系统——linux驱动学习笔记(三)
- 驱动设备管理
- Linux 驱动学习笔记
- linux驱动学习笔记
- linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想
- linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想
- linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想
- linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想
- Linux驱动学习(三)
- [Linux驱动]字符设备驱动学习笔记(三)———高级
- 学习笔记 --- LINUX LCD显示原理与驱动分析
- Openresty (nginx + lua)
- DOM详解
- SAPUI5拓展标准应用的Controller原理分析及应用实践
- Codeforces801A Vicious Keyboard
- SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表)
- Linux学习笔记(三)-设备管理与驱动
- 数据结构—链表—单链表应用-增序排列节点
- BIEE-2、RPD
- intellij idea macos 创建servlet 始终页面打不开 404
- POJ 2400 Supervisor, Supervisee (二分图最大权匹配)
- 中山大学软件工程操作系统实验二报告
- D(1909)Perfect Chocolate
- unix环境高级编程.chapter 1.1
- mongodb3.X版本 用户管理