Linux 设备和模块的分类
概念:在Linux系统中,所有设备都被映射成 【设备文件】 来处理,设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。
一、设备类型
整理自:(相当不错,建议有时间看下原文)
一般情况下,以 Linux 的设备可区分为 3 种基本设备类型:字符设备、块设备, 网络设备
一个字符设备或块设备都在/dev目录下对应一个设备文件。
linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和块设备。

- 字符设备
-
是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据。
字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。
本控制台( /dev/console )和串口( /dev/ttyS0)是字符设备的例子, 因为它们很好地展现了流的抽象.
字符设备通过文件系统结点来存取, 例如 /dev/tty1 和 /dev/lp0.
在一个字符设备和一个普通文件之间唯一有关的不同就是, 你经常可以在普通文件中移来移去, 但是大部分字符设备仅仅是数据通道, 你只能顺序存取.然而, 存在看起来象数据区的字符设备, 你可以在里面移来移去. 例如, frame grabber 经常这样, 应用程序可以使用 mmap 或者 lseek 存取整个要求的图像.
字符设备文件(类型为C):

备注:
细心的人,可能会发现设备文件是无文件大小的,取而代之的是两个号码:主设备号+此设备号(见下文)
- 块设备
-
是指可以从设备的任意位置读取一定长度数据的设备。块设备包括硬盘、磁盘、U盘和SD卡等
如同字符设备, 块设备通过位于 /dev 目录的文件系统结点来存取.
一个块设备(例如一个磁盘)应该是可以驻有一个文件系统的.
在大部分的 Unix 系统, 一个块设备只能处理这样的 I/O 操作, 传送一个或多个长度经常是 512 字节( 或一个更大的 2 的幂的数 )的整块.
Linux, 相反, 允许应用程序读写一个块设备象一个字符设备一样 -- 它允许一次传送任意数目的字节. 结果就是, 块和字符设备的区别仅仅在内核以及在内部管理数据的方式上, 并且因此在内核/驱动的软件接口上不同. 如同一个字符设备, 每个块设备都通过一个文件系统结点被存取的, 它们之间的区别对用户是透明的. 块驱动和字符驱动相比, 与内核的接口完全不同.
块设备文件(类型为B):

- 网络接口
-
任何网络事务都通过一个接口来进行, 就是说, 一个能够与其他主机交换数据的设备.
通常, 一个接口是一个硬件设备, 但是它也可能是一个纯粹的软件设备, 比如环回接口.
一个网络接口负责发送和接收数据报文, 在内核网络子系统的驱动下, 不必知道单个事务是如何映射到实际的被发送的报文上的.
很多网络连接( 特别那些使用 TCP 的)是面向流的, 但是网络设备却常常设计成处理报文的发送和接收.
一个网络驱动对单个连接一无所知; 它只处理报文.
既然不是一个面向流的设备, 一个网络接口就不象 /dev/tty1 那么容易映射到文件系统的一个结点上.
Unix 提供的对接口的存取的方式仍然是通过分配一个名子给它们( 例如 eth0 ), 但是这个名子在文件系统中没有对应的入口.
内核与网络设备驱动间的通讯与字符和块设备驱动所用的完全不同. 不用 于read 和 write, 而是由内核调用和报文传递相关的函数.
备注:linux文件类型还包括: 普通文件(-), 套接字文件(S), 链接文件(L),可见:《linux文件类型全解析》, 剩下还有其他:目录(D), 资料传输档案(FIFO, PIPE),
二、主设备号 与 次设备号
查看 主设备号 与 次设备号: ls -al /dev

查看当前已加载的设备驱动程序的主设备号: cat /proc/devices

第一列为主设备号,第二列为设备名
每个字符设备和块设备都必须有主次设备号,主设备号相同的设备是同类设备(使用同一驱动程序)
区别是否同类设备,可以更好的对设备进行管理和优化,主要体现在:
系统可能包含几个同样类型的设备,由同一个设备驱动程序管理(不需要重复加载驱动到内核)
可以将同类设备合并起来,便于插入到内核的数据结构中进行管理
三、其他
参照:《Linux内核--设备文件命名(官方文档)》, 《对于Linux内核tty设备的一点理解》
以下是在 Mac 系统中的一些小实验:
tty
1. 打开两个终端,都切换到 root
step1: 终端1:
#通过 tty 获取 当前终端 的对应的文件地址:
root# tty
/dev/ttys001
#持续监控 ttys001 文件内容
root# tail -f /dev/ttys001
step2: 终端2:
root# echo 'hello /dev/ttys0001' > /dev/ttys001
step3: 终端1 输出了一下内容:
hello /dev/ttys0001
2. ssh 到一台linux系统,都切换到 root
step1: 终端1:
#通过 tty 获取 当前终端 的对应的文件地址:
root# tty
/dev/pts/0
#持续监控 ttys001 文件内容
root# tail -f /dev/pts/0
step2: 终端2:
echo 'hello /dev/pts/0' > /dev/pts/0
step3: 终端1 输出了一下内容:
hello /dev/pts/0
Linux 设备和模块的分类的更多相关文章
- Linux 设备驱动 Edition 3
原文网址:http://oss.org.cn/kernel-book/ldd3/index.html Linux 设备驱动 Edition 3 By Jonathan Corbet, Alessand ...
- LINUX设备驱动程序笔记(一)设备驱动程序简单介绍
<一>:设备驱动程序的作用 从一个角度看,设备驱动程序的作用在于提供机制,而不是策略. 在编写驱动程序时,程序猿应该特别注意以下这个基本概念:编写訪问硬件的内核代码时,不要给用户强加不论什 ...
- Linux设备驱动学习笔记
之前研究Linux设备驱动时做的零零散散的笔记,整理出来,方便以后复习. 1.1驱动程序的的角色 提供机制 例如:unix图形界面分为X服务器和窗口会话管理器 X服务器理解硬件及提供统一的接口给用户程 ...
- linux设备驱动第一篇:设备驱动程序简介
首先,我们知道驱动是内核的一部分,那么驱动在内核中到底扮演了什么角色呢? 设备驱动程序在内核中的角色:他们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设 ...
- 《Linux内核设计与实现》读书笔记(十七)- 设备与模块
本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...
- linux设备驱动第二篇:构造和运行模块
上一篇介绍了Linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试驱动程序.而这个驱动的唯一功能就是输 ...
- linux设备驱动归纳总结(二):模块的相关基础概念【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-59415.html linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10 ...
- linux设备驱动程序_hello word 模块编译各种问题集锦
在看楼经典书籍<linux设备驱动程序>后,第一个程序就是编写一个hello word 模块. 原以为非常easy,真正弄起来,发现问题不少啊.前两天编过一次,因为没有记录,今天看的时候又 ...
- Linux设备驱动程序学习----3.模块的编译和装载
模块的编译和装载 更多内容请参考Linux设备驱动程序学习----目录 1. 设置测试系统 第1步,要先从kernel.org的镜像网站上获取一个主线内核,并安装到自己的系统中,因为学习驱动程序的编写 ...
随机推荐
- DotnetBrowser入门教程-入门
在.net core时代,web开发基本可以用.net core 2.0取代了.但是在传统领域,桌面开发仍然是不可以抛弃的,譬如: 1.用户需要和串口或者硬件打交道. 2.用户只想简单的安装好就使用, ...
- 研读:Shielding applications from an untrusted cloud with Haven
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHJ1c3Ribw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- 传输层:UDP 协议
一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此, ...
- java基础篇2之枚举
1.为什么要有枚举 问题:要定义星期几或者性别的变量,该怎么定义? 假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday=0; 枚举就是要让某个类型的变量的取值只能为若干个固定值 ...
- JAVA Eclipse 出现 load id=gralloc != hmi-id=gralloc怎么办
一般是应用程序权限导致的,在Manifest.xml文件中,targetSdkVersion设置不正确,你可以直接删掉这个信息
- 【SharePoint】SharePoint 2013 使用PreSaveAction自定义客户端验证
使用PreSaveAction函数实现客户端自定义验证. 例:[项目编号]为空时,必须填写[责任者]项.(其中[项目编号]为单行文本框,[责任者]为用户/组选择框.) function PreSave ...
- [Android]egit取消文件版本号控制
开发项目,多人合作开发变得越来越重要了,在此同一时候,使用git作为协同工具也是越来越多.在此.介绍一下egit取消文件版本号控制的方法. (egit即为eclipse中的git插件) 1.打开Nav ...
- Shell脚本值:运算符
算术运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用. expr 是一款表达式计算工具,使用它能完成表达式的求值操作. 例如:实现两个 ...
- 如何在vs2010中添加Picture控件
1.新建项目,并在对话框控件中拖入picture控件,并做如下设置 2.在picture控件的属性栏需要进行如下修改:ID需要修改,不能为static ID是控件的唯一标识,PictureCtrl(p ...
- C#日期时间类型格式化大全集 C#DateTime 类型格式化大全集
日期转化一 为了达到不同的显示效果有时,我们须要对时间进行转化,默认格式为:2007-01-03 14:33:34 ,要转化为其它格式,要用到DateTime.ToString的方法(String, ...