共 1 篇文章

标签:深入了解Linux字符设备主设备号范围 (linux 字符设备主设备号范围)

深入了解Linux字符设备主设备号范围 (linux 字符设备主设备号范围)

Linux系统作为一种开源操作系统,其深受广大技术人员的青睐,是众多大型服务器的首选。而其中的字符设备主设备号也是Linux系统中的一个重要概念。本文将,帮助读者更好地理解Linux系统。 一、什么是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系统! 相关问题拓展阅读: 在linux中是不是能看到设备节点就说明设备可以被访问了解决思路 Linux字符设备驱动调试,求大神指教,答得好另外追加分数!谢谢! 在linux中是不是能看到设备节点就说明设备可以被访问了解决思路 Linux 中的设备有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...

技术分享