Linux 设备和模块的分类

概念:在Linux系统中,所有设备都被映射成 【设备文件】 来处理,设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。

一、设备类型

整理自:(相当不错,建议有时间看下原文)

    《第一章 设备驱动简介 1.3.节 设备和模块的分类

    《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,代表目录

  

二、主设备号 与 次设备号

  查看 主设备号 与 次设备号: ls -al /dev

    

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

    

      第一列为主设备号,第二列为设备名

  每个字符设备和块设备都必须有主次设备号,主设备号相同的设备是同类设备(使用同一驱动程序)

  区别是否同类设备,可以更好的对设备进行管理和优化,主要体现在:

    系统可能包含几个同样类型的设备,由同一个设备驱动程序管理(不需要重复加载驱动到内核)

    可以将同类设备合并起来,便于插入到内核的数据结构中进行管理

三、其他

  参照:《tty、pty、pts等设备命名规则

  以下是在 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

时间: 2024-08-24 03:56:53

Linux 设备和模块的分类的相关文章

Linux设备驱动程序(一)设备驱动程序简介

机制or策略: 驱动提供机制(what),而不是提供策略(how): 内核功能划分: 根据内核完成任务的不同,可分为如下几个部分: 1. 进程管理 负责进程的的创建和销毁,并处理它们和外部之间的连接(输入输出).不同进程之间的通信是整个系统的基本功能,因此由内核处理. 除此之外,控制进程如何共享CPU的调度器也是进程管理的一部分. 概括来说,内核进程管理就是在单个或者多个CPU上实现了多个进程的抽象. 2. 内存管理 内存是计算机的主要资源之一,用来管理内存的策略是决定系统性能的一个关键因素.

LINUX设备驱动程序笔记(一)设备驱动程序简介

<一>:设备驱动程序的作用 从一个角度看,设备驱动程序的作用在于提供机制,而不是策略.在编写驱动程序时,程序员应该特别注意下面这个基本概念:编写访问硬件的内核代码时,不要给用户强加任何特定策略.因为不同的用户有不同的需求,驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上层应用程序. 从另一个角度来看驱动程序,它还可以看作是应用程序和实际设备之间的一个软件层. 总的来说,驱动程序设计主要还是综合考虑下面三个方面的因素:提供给用户尽量多的选项.编写驱动程序要占用的时间以及尽量保持

linux设备驱动第一篇:设备驱动程序简介

首先,我们知道驱动是内核的一部分,那么驱动在内核中到底扮演了什么角色呢? 设备驱动程序在内核中的角色:他们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节.(说白了,驱动程序除了对外提供特定的接口外,任何实现细节对应用程序都是不可见的.)用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序.驱动程序的任务是把这些标准化调用映射到实际硬件的设备特有操作上. 在编写驱动程序时,程序员应该特别注意下面这个概念:编写访问硬件的内核代

linux设备驱动第一篇:基础知识点

首先,我们知道驱动是内核的一部分,那么驱动在内核中到底扮演了什么角色呢? 设备驱动程序在内核中的角色:他们是一个个独立的"黑盒子",使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节.(说白了,驱动程序除了对外提供特定的接口外,任何实现细节对应用程序都是不可见的.)用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序.驱动程序的任务是把这些标准化调用映射到实际硬件的设备特有操作上. 在编写驱动程序时,程序员应该特别注意下面这个概念:编写访问硬

LINUX设备驱动程序笔记(一)设备驱动程序简单介绍

<一>:设备驱动程序的作用 从一个角度看,设备驱动程序的作用在于提供机制,而不是策略. 在编写驱动程序时,程序猿应该特别注意以下这个基本概念:编写訪问硬件的内核代码时,不要给用户强加不论什么特定策略.由于不同的用户有不同的需求,驱动程序应该处理如何使硬件可用的问题.而将如何使用硬件的问题留给上层应用程序. 从还有一个角度来看驱动程序.它还能够看作是应用程序和实际设备之间的一个软件层. 总的来说,驱动程序设计主要还是综合考虑以下三个方面的因素:提供给用户尽量多的选项.编写驱动程序要占用的时间以及

Linux 设备驱动 Edition 3

原文网址:http://oss.org.cn/kernel-book/ldd3/index.html Linux 设备驱动 Edition 3 By Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman 由 quickwhale 翻译的简体中文版 V0.1.0 2006-6-2 遵循原版的版权声明. 还在完善中. 欢迎任何意见, 请给我邮件. 请发信至 quickwhale 的邮箱 <[email protected]> 版权 ©

LINUX设备驱动程序(第3版)pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介编辑<LINUX设备驱动程序(第3版)>已针对Linux内核的2610版本彻底更新过了.内核的这个版本针对常见任务完成了合理化设计及相应的简化,如即插即用.利用sysfs文件系统和用户空间交互,以及标准总线上的多设备管理等等.要阅读并理解本书,您不必首先成为内核黑客:只要您理解C语言并具有Unix系统调用的一些背景知识即可.您将学到如何为字符设备.块设备和网络接口编写驱动程序.为此,<LINUX设备驱动程序(第3版)>提供了完整的示例

LINUX设备驱动程序(第3版)下载 &#113638;

下载地址: http://www.gqylpy.com/di/16 <LINUX设备驱动程序(第3版)>PDF高清完整版-下载 内容简介 编辑 <LINUX设备驱动程序(第3版)>已针对Linux内核的2610版本彻底更新过了.内核的这个版本针对常见任务完成了合理化设计及相应的简化,如即插即用.利用sysfs文件系统和用户空间交互,以及标准总线上的多设备管理等等.要阅读并理解本书,您不必首先成为内核黑客:只要您理解C语言并具有Unix系统调用的一些背景知识即可.您将学到如何为字符设

linux设备驱动第二篇:构造和运行模块

上一篇介绍了linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试驱动程序.而这个驱动的唯一功能就是输出hello world. 在编写具体的实例之前,我们先来了解下linux内核下调试程序的一个重要函数printk以及几个重要概念. printk类似c语言的printf,是内核中输出打印信息的函数.以后驱动调试中的重要性不言而喻,下面先做一个简单介绍. printk的级别 日志级别一共有8个级别,pr