Linux系统作为一种开源操作系统,其深受广大技术人员的青睐,是众多大型服务器的首选。而其中的字符设备主设备号也是Linux系统中的一个重要概念。本文将,帮助读者更好地理解Linux系统。
创新互联建站自2013年创立以来,是专业互联网技术服务公司,拥有项目网站建设、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元盐田做网站,已为上家服务,为盐田各地企业和个人服务,联系电话:028-86922220
一、什么是Linux字符设备主设备号
在Linux系统中,每个设备都有其独特的设备号,这个设备号是由主设备号和次设备号组成的。其中,主设备号和Linux内核中定义的每个字符设备驱动程序相关联,也就是说,它们指定哪些设备属于特定的设备类型。而次设备号则是用于区分相同类型的不同设备,它们可以是硬件设备中使用的物理编号。
字符设备主设备号是一个非负整数,它代表了Linux内核驱动程序模块中的字符设备类型。当用户空间发起一个设备请求时,内核通过设备号来找到正确的设备驱动程序,并将请求转发到相关的设备实例。
二、Linux字符设备主设备号范围
在Linux系统中,主设备号是一个0到255之间的数字。所有的字符设备驱动程序都与主设备号相关联。因此为了避免相同类型的不同设备之间的冲突,Linux内核规定了主设备号的范围和使用方式。在此范围内,系统中任何一个设备驱动程序都应该使用唯一的主设备号。
具体来说,Linux系统中主设备号的范围如下:
1.内核本身使用的0-255号之间的数字;
2.开发者使用的256号到511号之间的数字,这些是用于开发一些新的设备驱动程序或者修改现有的设备驱动程序;
3.作为设备节点使用的512号到4095号之间的数字。这些用于唯一标识每个特定类型的设备。例如,硬盘驱动程序可以使用主设备号为3,而不同的物理磁盘可以使用不同的次设备号进行区分。
需要注意的是,不同的设备类型可以使用相同的主设备号,但它们必须有不同的次设备号。这也是为什么主设备号和次设备号都需要的原因。
三、如何使用Linux字符设备主设备号
在Linux系统中,使用字符设备主设备号的事情是由设备驱动程序来处理的。当驱动程序被加载到内核中时,它会通过以下方式将自己与主设备号相关联:
1.注册字符设备-驱动程序通过调用Linux系统在文件系统上创建字符设备的函数来注册自己的主设备号。
2.打开设备节点-当用户空间的应用程序打开一个设备节点时,内核会识别节点的主设备号,然后找到匹配的驱动程序,并创建一个设备实例来代表该设备的进程。
3.发送设备请求-应用程序可以向设备驱动程序发送设备请求,请求会被转发到正确的设备实例,然后由驱动程序处理。
4.关闭设备节点-当一个应用程序关闭一个设备节点时,内核将自动删除与该节点相关联的设备实例,释放设备资源。
字符设备主设备号是Linux系统中非常重要的一个概念。它是用于唯一区分不同类型设备的数字。使用Linux字符设备主设备号时,需要遵循一定的规则来确保设备之间不会发生冲突。因此,当开发Linux设备驱动程序时,对字符设备主设备号的深入了解是非常有必要的,这将有助于开发者更好地理解Linux系统!
成都网站建设公司-创新互联,建站经验丰富以策略为先导10多年以来专注数字化网站建设,提供企业网站建设,高端网站设计,响应式网站制作,设计师量身打造品牌风格,热线:028-86922220Linux 中的设备有2种类型:字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且磨洞桐可以随机存取)。每个字符设备和块设备都必须有主、次设备号,主设备号相同的设备是同类设备(使用同一个驱动程序)。这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为”虚拟设备”)。每个设备在 /dev 目录下都有一个对应的文件(节点)。可以通过 cat /proc/devices 命令查看当前已经加载的设备驱动程序的主设备号。内核能够识别的所有设备都记录在原码树下的 Documentation/devices.txt 文件中。在 /dev 目录下除了字符设备和块设备节点之外还通常还会存在:FIFO管道、Socket、软/硬连接、目录。这些东西没有主/次设备号。
了解这些设备的最基本要求就是对 每个设备文件的含义了如指掌,下面就医列表的形式列出常见的设备文件以及相应的含义(比较偏僻的就省略了):
主设备号 设备类型
次设备号=文件名 简要说明
0 未命名设备(例如:挂载的非设备)
0 = 未空设备号保留
1 char 内存设备
1 = /dev/mem 直接存取物理瞎坦内存
2 = /dev/kmem 存取经过内核虚拟之后的内存
3 = /dev/null 空设备。任何写入都将被直接丢弃,任何读取都将得到EOF。
4 = /dev/port 存取 I/O 端口
5 = /dev/zero 零字节源,只能读取到无限多的零字节。
7 = /dev/full 满设备。任何写入都将失败,并把errno设为ENOSPC以表示没有剩余空间。
8 = /dev/random 随机数发生器。完全由用户的输入来产生随机数。
如果用户停止所有动作,则停止产生新的随机数。
9 = /dev/urandom 更快,但是不够安全的随机数发生器。尽可能由用户的输入来产生随机数,
如果用户停止所有动作,则把已经产生的随机数做为种子来产生新的随机数。
10 = /dev/aio 异步 I/O 通知接口
11 = /dev/kmsg 任何对该文件的写入都将作为 printk 的输出
1 block RAM disk
0 = /dev/ram0 第1个 RAM disk (initrd只能使用ram0)
1 = /dev/ram1 第2个 RAM disk
…
200 = /dev/ram200 第200个 RAM disk
4 char TTY(终端)设备
0 = /dev/tty0 当前虚拟控制台
1 = /dev/tty1 第1个虚拟控制台
…
63 = /dev/tty63 第63个虚拟控制台
4 block 如果根文件系统以是以只读方式挂载的,那么就不可能创建真正的设备节颤颤点,
此时就使用该设备作为动态分配的主(major)设备的别名
0 = /dev/root
5 char 其他 TTY 设备
0 = /dev/tty 当前 TTY 设备
1 = /dev/console 系统控制台
2 = /dev/ptmx 所有 PTY master 的复用器
7 char 虚拟控制台捕捉设备(这些设备既允许读也允许写)
0 = /dev/vcs 当前虚拟控制台(vc)的文本内容
1 = /dev/vcs1 tty1 的文本内容
…
63 = /dev/vcs63 tty63 的文本内容
128 = /dev/vcsa 当前虚拟控制台(vc)的文本/属性内容
129 = /dev/vcsa1 tty1 的文本/属性内容
…
191 = /dev/vcsa63 tty63 的文本/属性内容
7 block 回环设备(用一个普通的磁盘文件来模拟一个块设备)
对回环设备的绑定由 mount(8) 或 losetup(8) 处理
0 = /dev/loop0 第1个回环设备
1 = /dev/loop1 第2个回环设备
…
8 block SCSI 磁盘(0-15)
0 = /dev/sda 第1个 SCSI 磁盘(整个磁盘)
16 = /dev/sdb 第2个 SCSI 磁盘(整个磁盘)
32 = /dev/sdc 第3个 SCSI 磁盘(整个磁盘)
…
240 = /dev/sdp 第16个 SCSI 磁盘(整个磁盘)
分区表示方法如下(以第3个 SCSI 磁盘为例)
33 = /dev/sdc1 第1个分区
34 = /dev/sdc2 第2个分区
…
47 = /dev/sdc15 第15个分区
对于Linux/i386来说,分区1-4是主分区,5-15是逻辑分区。
9 block Metadisk(RAID)设备
0 = /dev/md0 第1组 metadisk
1 = /dev/md1 第2组 metadisk
…
metadisk 驱动用于将同一个文件系统分割到多个物理磁盘上。
10 char 非串口鼠标,各种杂项设备和特性
1 = /dev/psaux PS/2鼠标
131 = /dev/temperature 机器内部温度
134 = /dev/apm_bios APM(高级电源管理) BIOS
135 = /dev/rtc 实时时钟(Real Time Clock)
144 = /dev/nvram 非易失配置 RAM
162 = /dev/bus 系统管理总线(System Management Bus)
164 = /dev/ipmo Intel的智能平台管理(Intelligent Platform Management)接口
173 = /dev/ipmikcs 智能平台管理(Intelligent Platform Management)接口
175 = /dev/agpgart AGP图形地址重映射表(Graphics Address Remapping Table)
182 = /dev/perfctr 性能监视计数器
183 = /dev/hwrng 通用硬件随机数发生器
184 = /dev/cpu/microcode CPU微代码更新接口
186 = /dev/atomicps 进程状态数据的原子快照
188 = /dev/buios Bus(系统管理总线) BIOS
200 = /dev/net/tun TAP/TUN 网络设备(TAP/TUN以软件的方式实现了网络设备)
TAP模拟了以太网帧(第二层),TUN模拟了IP包(第三层)。
202 = /dev/emd/ctl 增强型 Metadisk RAID (EMD) 控制器
220 = /dev/mptctl Message passing technology (MPT) control
223 = /dev/input/uinput 用户层输入设备驱动支持
227 = /dev/mcelog X86_64 Machine Check Exception driver
228 = /dev/hpet HPET driver
229 = /dev/fuse Fuse(用户空间的虚拟文件系统)
231 = /dev/snapshot 系统内存快照
232 = /dev/kvm 基于内核的虚构机(基于AMD SVM和Intel VT硬件虚拟技术)
11 block SCSI CD-ROM 设备
0 = /dev/scd0 第1个 SCSI CD-ROM
1 = /dev/scd1 第2个 SCSI CD-ROM
…
13 char 核心输入设备
32 = /dev/input/mouse0 第1个鼠标
33 = /dev/input/mouse1 第2个鼠标
…
62 = /dev/input/mouse30 第31个鼠标
63 = /dev/input/mice 所有鼠标的统一
64 = /dev/input/event0 第1个事件队列
65 = /dev/input/event1 第2个事件队列
…
95 = /dev/input/event1 第32个事件队列
21 char 通用 SCSI 设备(通常是SCSI光驱)
0 = /dev/sg0 第1个通用 SCSI 设备
1 = /dev/sg1 第2个通用 SCSI 设备
…
29 char 通用帧缓冲(frame buffer)设备
0 = /dev/fb0 第1个帧缓冲设备
1 = /dev/fb1 第2个帧缓冲设备
…
31 = /dev/fb31 第32个帧缓冲设备
30 char iBCS-2 兼容设备
0 = /dev/socksys 套接字访问接口
1 = /dev/spx SVR3 本地 X 接口
32 = /dev/inet/ip 网络访问接口
33 = /dev/inet/icmp
34 = /dev/inet/ggp
35 = /dev/inet/ipip
36 = /dev/inet/tcp
37 = /dev/inet/egp
38 = /dev/inet/pup
39 = /dev/inet/udp
40 = /dev/inet/idp
41 = /dev/inet/rawip
此外,iBCS-2 还需要下面的连接必须存在
/dev/ip -> /dev/inet/ip
/dev/icmp -> /dev/inet/icmp
/dev/ggp -> /dev/inet/ggp
/dev/ipip -> /dev/inet/ipip
/dev/tcp -> /dev/inet/tcp
/dev/egp -> /dev/inet/egp
/dev/pup -> /dev/inet/pup
/dev/udp -> /dev/inet/udp
/dev/idp -> /dev/inet/idp
/dev/rawip -> /dev/inet/rawip
/dev/inet/arp -> /dev/inet/udp
/dev/inet/rip -> /dev/inet/udp
/dev/nfsd -> /dev/socksys
/dev/X0R -> /dev/null
36 char Netlink 支持
0 = /dev/route 路由, 设备更新, kernel to user
3 = /dev/fwmonitor Firewall packet 复制
59 char sf 防火墙模块
0 = /dev/firewall 与 sf 内核模块通信
65 block SCSI 磁盘(16-31)
0 = /dev/sdq 第17个 SCSI 磁盘(整个磁盘)
16 = /dev/sdr 第18个 SCSI 磁盘(整个磁盘)
32 = /dev/sds 第19个 SCSI 磁盘(整个磁盘)
…
240 = /dev/sdaf 第32个 SCSI 磁盘(整个磁盘)
66 block SCSI 磁盘(32-47)
0 = /dev/sdag 第33个 SCSI 磁盘(整个磁盘)
16 = /dev/sdah 第34个 SCSI 磁盘(整个磁盘)
32 = /dev/sdai 第35个 SCSI 磁盘(整个磁盘)
…
240 = /dev/sdav 第48个 SCSI 磁盘(整个磁盘)
89 char I2C 总线接口
0 = /dev/i2c-0 第1个 I2C 适配器
1 = /dev/i2c-1 第2个 I2C 适配器
…
98 block 用户模式下的虚拟块设备(分区处理方式与 SCSI 磁盘相同)
0 = /dev/ubda 第1个用户模式块设备
16 = /dev/udbb 第2个用户模式块设备
…
103 block 审计(Audit)设备
0 = /dev/audit 审计(Audit)设备
char Unix98 PTY master
这些设备不应当存在设备节点,而应当通过 /dev/ptmx 接口访问。
char Unix98 PTY slave
这些设备节点是自动生成的(伴有适当的权限和模式),不能手动创建。
方法是通过使用适当的 mount 选项(通常是:mode=0620,gid=)
将 devpts 文件系统挂载到 /dev/pts 目录即可。
0 = /dev/pts/0 第1个 Unix98 PTY slave
1 = /dev/pts/1 第2个 Unix98 PTY slave
…
153 block Enhanced Metadisk RAID (EMD) 存储单元(分区处理方式与 SCSI 磁盘相同)
0 = /dev/emd/0 第1个存储单元
1 = /dev/emd/0p1 第1个存储单元的第1个分区
2 = /dev/emd/0p2 第1个存储单元的第2个分区
…
15 = /dev/emd/0p15 第1个存储单元的第15个分区
16 = /dev/emd/1 第2个存储单元
32 = /dev/emd/2 第3个存储单元
…
240 = /dev/emd/15 第16个存储单元
180 char USB 字符设备
96 = /dev/u/hiddev0 第1个USB人机界面设备(鼠标/键盘/游戏杆/手写版等人操作计算机的设备)
…
111 = /dev/u/hiddev15 第16个USB人机界面设备
180 block USB 块设备(U盘之类)
0 = /dev/uba 第1个USB 块设备
8 = /dev/ubb 第2个USB 块设备
16 = /dev/ubc 第3个USB 块设备
…
192 char 内核 profiling 接口
0 = /dev/profile Profiling 控制设备
1 = /dev/profile0 CPU 0 的 Profiling 设备
2 = /dev/profile1 CPU 1 的 Profiling 设备
…
193 char 内核事件跟踪接口
0 = /dev/trace 跟踪控制设备
1 = /dev/trace0 CPU 0 的跟踪设备
2 = /dev/trace1 CPU 1 的跟踪设备
…
195 char Nvidia 图形设备(比如显卡)
0 = /dev/nvidia0 第1个 Nvidia 卡
1 = /dev/nvidia1 第2个 Nvidia 卡
…
255 = /dev/nvidiactl Nvidia 卡控制设备
202 char 特定于CPU模式的寄存器(model-specific register,MSR)
0 = /dev/cpu/0/msr CPU 0 的 MSRs
1 = /dev/cpu/1/msr CPU 1 的 MSRs
…
203 char CPU CPUID 信息
0 = /dev/cpu/0/cpuid CPU 0 的 CPUID
1 = /dev/cpu/1/cpuid CPU 1 的 CPUID
…
===================================================================
这部分详细说明一些应该或可能存在于 /dev 目录之外的文件。
链接更好使用与这里完全相同的格式(绝对路径或相对路径)。
究竟是使用硬链接(hard)还是软连接(symbolic)取决于不同的设备。
必须的链接
必须在所有的系统上都存在这些连接:
链接 目标 链接类型 简要说明
/dev/fd /proc/self/fd symbolic 文件描述府
/dev/stdin fd/0 symbolic 标准输入文件描述府
/dev/stdout fd/1 symbolic 标准输出文件描述符
/dev/stderr fd/2 symbolic 标准错误文件描述符
/dev/nfsd socksys symbolic 仅为 iBCS-2 所必须
/dev/X0R null symbolic 仅为 iBCS-2 所必须
/dev/X0R 是 —
推荐的链接
推荐在所有的系统上都存在这些连接:
链接 目标 链接类型 简要说明
/dev/core /proc/kcore symbolic 为了向后兼容
/dev/ramdisk ram0 symbolic 为了向后兼容
/dev/ftape qft0 symbolic 为了向后兼容
/dev/bttv0 video0 symbolic 为了向后兼容
/dev/radio radio0 symbolic 为了向后兼容
/dev/i2o* /dev/i2o/* symbolic 为了向后兼容
/dev/scd? sr? hard 代替 SCSI CD-ROM 的名字
本地定义的链接
下面的链接很可能需要根据机器的实际硬件配置创建其中的一部分甚至全部。
这些链接仅仅是为了迎合习惯用法,它们既非必须也非推荐。
链接 目标 链接类型 简要说明
/dev/mouse mouse port symbolic 当前鼠标
/dev/tape tape device symbolic 当前磁带
/dev/cdrom CD-ROM device symbolic 当前CD-ROM
/dev/cdwriter CD-writer symbolic 当前CD-writer
/dev/scanner scanner symbolic 当前扫描仪
/dev/modem modem port symbolic 当前调制解调器
/dev/root root device symbolic 当前根文件系统所在设备
/dev/swap swap device symbolic 当前swap所在设备
/dev/modem 不应当用于能够同时支持呼入和呼出的modem,因为往往会导致锁文件问题。
如果存在 /dev/modem ,那么它应当指向一个恰当的主 TTY 设备。
对于SCSI设备,
/dev/tape 和 /dev/cdrom 应该分别指向”cooked”设备 /dev/st* 和 /dev/sr* ;
而 /dev/cdwriter 和 /dev/scanner 应当分别指向恰当的 /dev/sg* 。
/dev/mouse 可以指向一个主串行 TTY 设备、一个硬件鼠标、
或者一个对应鼠标驱动程序的套接字(例如 /dev/gpmdata)。
套接字和管道
持久套接字和命名管道可以存在于 /dev 中。常见的有:
/dev/printer socket lpd 本地套接字
/dev/log socket syslog 本地套接字
/dev/gpmdata socket gpm 鼠标多路复用器(multiplexer)
/dev/gpmctl socket (LFS-LiveCD中出现)
/dev/initctl fifo pipe init 监听它并从中获取信息(用户与 init 进程交互的通道)
挂载点
以下名称被保留用于挂载特殊的文件系统。
这些特殊的文件系统只提供内核界面而不提供标准的设备节点。
/dev/pts devpts PTY slave 文件系统
/dev/shm tmpfs 提供对 POSIX 共享内存的直接访问
===================================================================
终端(或TTY)设备是一种特殊的字符设备。终端设备是可以在会话中扮演控制终端角色的任何设备,
包括:虚拟控制台、串行接口(已废弃)、伪终端(PTY)。
所有的终端设备共享一个通用的功能:line discipline,
它既包含通用的终端 line discipline 也包含SLIP和PPP模式。
所有的终端设备的命名都很相似。这部分内容将解释命名规则和各种类型的TTY(终端)的使用。
需要注意的是这些命名习惯包含了几个历史遗留包袱。
其中的一些是Linux所特有的,另一些则是继承自其他系统,
还有一些反映了Linux在成长过程中抛弃了原来借用自其它系统的一些习惯。
井号(#)在设备名里表示一个无前导零的十进制数。
虚拟控制台(Virtual console)和控制台设备(console device)
虚拟控制台是在系统视频监视器上全屏显示的终端。
虚拟控制台被命名为编号从 /dev/tty1 开始的 /dev/tty# 。
/dev/tty0 是当前虚拟控制台。
/dev/tty0 用于在不能使用帧缓冲设备(/dev/fb*)的机器上存取系统视频卡,
注意,不要将 /dev/console 用于此目的。
/dev/console 由内核管理,系统消息将被发送到这里。
单用户模式下必须允许 login 使用 /dev/console 。
串行接口(已废弃)
这里所说的”串行接口”是指 RS-232 串行接口和任何模拟这种接口的设备,
不管是在硬件(例如调制解调器)还是在软件(例如ISDN驱动)中模拟。
在linux中的每一个串行接口都有两个设备名:
主设备或呼入(callin)设备、交替设备或呼出(callout)设备。
设备类型之间使用字母的大小写进行区分。
比如,对于任意字母X,”tty”设备名为 /dev/ttyX# ,而”cu”设备名则为 /dev/cux# 。
由于历史原因,/dev/ttyS# 和 /dev/ttyC# 分别等价于 /dev/cua# 和 /dev/cub# 。
名称 /dev/ttyQ# 和 /dev/cuq# 被保留为本地使用。
伪终端(PTY)
伪终端用于创建登陆会话或提供其它功能,
比如通过 TTY line discipline (包括SLIP或者PPP功能)来处理任意的数据生成。
每一个 PTY 都有一个master端和一个slave端。按照 System V/Unix98 的 PTY 命名方案,
所有master端共享同一个 /dev/ptmx 设备节点(打开它内核将自动给出一个未分配的PTY),
所有slave端都位于 /dev/pts 目录下,名为 /dev/pts/# (内核会根据需要自动生成和删除它们)。
一旦master端被打开,相应的slave设备就可以按照与 TTY 设备完全相同的方式使用。
master设备与slave设备之间通过内核进行连接,等价于拥有 TTY 功能的双向管道(pipe)。
===============================
你可能会很奇怪,为什么没有 /dev/hda 这样的设备,难道不常用么?
OK,菜鸟推荐看linux设备驱动ddr3一书,比什么效果都好!
static int driver_init( void )
//设备初始化函数,static是为了本函数只是在本文件中访问,不在其他文件中调用
{
int rc;
driver_dev = MKDEV( DEV_MAJOR, DEV_MINOR );
//用主设备号DEV_MAJOR和从设备号DEV_MINOR生成设备号
rc = register_chrdev_region( driver_dev, 1, “driver” );
//为一个字符驱动获取一个设备编号
if(rc owner = THIS_MODULE;
//填写设备驱动的相关信息
driver_cdev->ops = &driver_fops;
//填写操纵这个字符设备文件的方法
cdev_init( driver_cdev, &driver_fops );
//一般调用driver_fops中的一些方法来初始化设备文件
cdev_add( driver_cdev, driver_dev, 1 );
//将该设备放到系统设备链中
printk(KERN_ALERT “initial Device Successfully!\n”);
//输出调试信息:成功
return( 0 ); //返回0宣告函数正常退出
}
这是一个简单的示例,让你了解字符设备驱动的注册过程,上面的作用就是注册了一个主设备号为DEV_MAJOR次设备号为DEV_MINOR的字符设备驱动,对它的操作函数是driver_fops中。
linux 字符设备主设备号范围的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 字符设备主设备号范围,深入了解Linux字符设备主设备号范围,在linux中是不是能看到设备节点就说明设备可以被访问了解决思路,Linux字符设备驱动调试,求大神指教,答得好另外追加分数!谢谢!的信息别忘了在本站进行查找喔。
创新互联【028-86922220】值得信赖的成都网站建设公司。多年持续为众多企业提供成都网站建设,成都品牌建站设计,成都高端网站制作开发,SEO优化排名推广服务,全网营销让企业网站产生价值。
分享标题:深入了解Linux字符设备主设备号范围(linux字符设备主设备号范围)
路径分享:http://www.shufengxianlan.com/qtweb/news38/248838.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联