说实话,对linux的设备命名管理不是很赞同。我用minicom时,开始插入串口是ttyS0,有时拔出再插入又变成ttyS1,再一次又会变成ttyS2,所以不得不每次先查看/dev的名字,再设定minicom链接哪一个。还有比如我写的usb传输程序打开的是/dev/usb0,但到了别人机子上又要改成/dev/usb1。
我想难道没有更好的方法吗?虽然udev比以前的devfs先进了不少,但有时还是有些缺憾。
不过这也不是什么大问题,让使用者运行程序前先选择一下设备文件就OK了,或者当作参数传递给应用程序。我想插入vfat格式的U盘后自动挂载就是这样做的吧。
下面是一些设备的命名:
设备管理是linux中比较基础的东西,但是由于Linux智能程度的越来越高,Udev的使用越来越广泛,使得越来越多的Linux新用户对 /dev 目录下的东西变得不再熟悉。有时候遇见问题就会变得抓狂。
Linux
中的设备有2种类型:字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。每个字符设备和块设备都必须有主、次设备号,主设备号相同的设
备是同类设备(使用同一个驱动程序)。这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,
又称为"虚拟设备")。每个设备在 /dev 目录下都有一个对应的文件(节点)。可以通过 cat /proc/devices
命令查看当前已经加载的设备驱动程序的主设备号。内核能够识别的所有设备都记录在原码树下的 Documentation/devices.txt
文件中。在 /dev 目录下除了字符设备和块设备节点之外还通常还会存在:FIFO管道、Socket、软/硬连接、目录。这些东西没有主/次设备号。
设备文件
Linux内核所能识别的所有设备都记录在
http://www.lanana.org/docs/device-list/
而内核原码树中的 Documentation/devices.txt 可能不是最新版本。
了解这些设备的最基本要求就是对每个设备文件的含义了如指掌,下面列出常见的设备文件以及相应的含义(比较偏僻的就省略了)。
----------------------------------------------------------------------
主设备号 设备类型
次设备号=文件名 简要说明
----------------------------------------------------------------------
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 blockRAM disk
0 = /dev/ram0第1个 RAM disk (initrd只能使用ram0)
1 = /dev/ram1第2个 RAM disk
...
200 = /dev/ram200第200个 RAM disk
4 charTTY(终端)设备
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系统控制台(一般是/dev/tty0)
2 = /dev/ptmx所有 PTY master 的复用器
7 char虚拟控制台捕