linux 设备模型

 

设备种类

graph LR;
    X(模型)
    X-->A(设备 device)-->A1(挂载在某个总线的物理设备)
    X-->B(驱动 driver)-->B1(与特定设备相关软件, 负责初始化设备及提供操作方式)
    X-->C(总线 bus)-->C1(负责管理挂载对应总线的设备及驱动, 如platform 总线、SPI总线、I2C总线)
    X-->D(类 class)-->D1(具有相同功能的设备)

字符设备

字符设备只能逐字节读写, 面向流, 不能随机读取设备内存中某一数据, 读取数据需要按照先后数据

常见字符设备有鼠标、键盘、串口、控制台、LED设备等

块设备

块设备可从设备任意位置读取一定长度数据, 常见块设备包括电脑硬盘、SD卡、U盘、光盘等

网络设备

网络事务都经过一个网络接口形成, 即一个能够和其他主机交换数据的设备

访问网络接口方法仍然是给它们分配一个唯一名字(如eth0), 但这个名字在文件系统中不存在对应节点

常见网络设备包括网卡设备、蓝牙设备等

设备管理

linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和块设备

各种硬件设备以文件形式存放于/dev下, 使用ls /dev查看

autofs           i2c-8             nvram     tty27  tty62      uhid
block            initctl           port      tty28  tty63      uinput
btrfs-control    input             ppp       tty29  tty7       urandom
bus              kmsg              psaux     tty3   tty8       usb
char             kvm               ptmx      tty30  tty9       userfaultfd
console          log               pts       tty31  ttyprintk  userio
core             loop0             random    tty32  ttyS0      vcs
cpu              loop1             rfkill    tty33  ttyS1      vcs1
cpu_dma_latency  loop10            rtc       tty34  ttyS10     vcs2
cuse             loop11            rtc0      tty35  ttyS11     vcs3
disk             loop12            shm       tty36  ttyS12     vcs4
dma_heap         loop13            snapshot  tty37  ttyS13     vcs5
dri              loop14            snd       tty38  ttyS14     vcs6
ecryptfs         loop2             stderr    tty39  ttyS15     vcsa
fb0              loop3             stdin     tty4   ttyS16     vcsa1
fd               loop4             stdout    tty40  ttyS17     vcsa2
full             loop5             tpm0      tty41  ttyS18     vcsa3
fuse             loop6             tpmrm0    tty42  ttyS19     vcsa4
gpiochip0        loop7             tty       tty43  ttyS2      vcsa5
gpiochip1        loop8             tty0      tty44  ttyS20     vcsa6
hidraw0          loop9             tty1      tty45  ttyS21     vcsu
hidraw1          loop-control      tty10     tty46  ttyS22     vcsu1
hidraw2          mapper            tty11     tty47  ttyS23     vcsu2
hidraw3          mcelog            tty12     tty48  ttyS24     vcsu3
hidraw4          mem               tty13     tty49  ttyS25     vcsu4
hidraw5          mqueue            tty14     tty5   ttyS26     vcsu5
hidraw6          net               tty15     tty50  ttyS27     vcsu6
hidraw7          ng0n1             tty16     tty51  ttyS28     vfio
hpet             null              tty17     tty52  ttyS29     vga_arbiter
hugepages        nvidia0           tty18     tty53  ttyS3      vhci
hwrng            nvidia-caps       tty19     tty54  ttyS30     vhost-net
i2c-0            nvidiactl         tty2      tty55  ttyS31     vhost-vsock
i2c-1            nvidia-modeset    tty20     tty56  ttyS4      zero
i2c-2            nvidia-uvm        tty21     tty57  ttyS5      zfs
i2c-3            nvidia-uvm-tools  tty22     tty58  ttyS6
i2c-4            nvme0             tty23     tty59  ttyS7
i2c-5            nvme0n1           tty24     tty6   ttyS8
i2c-6            nvme0n1p1         tty25     tty60  ttyS9
i2c-7            nvme0n1p2         tty26     tty61  udmabuf

linux把对硬件操作全部抽象成对文件操作

在设备管理中, 除了设备类型外, 内核还需要一对被称为主从设备号参数, 才能唯一标识一个设备

主设备号

用于标识驱动程序, 相同主设备号使用相同驱动程序, 例如: S3C2440 有串口、LCD、触摸屏三种设备, 其主设备号各不相同

从设备号

用于标识同一驱动程序下不同硬件

例IDE设备, 主设备号用于标识该硬盘, 从设备号用于标识每个分区, 2440有三个串口, 每个串口主设备号相同, 从设备号用于区分具体属于那一个串口

/dev

  • /dev/null

空设备, 也称为位桶($bit bucket$)、回收站、无底洞, 向它输出任何数据都会被抛弃

若不想让消息以标准输出显示或写入文件, 那么可以将消息重定向到位桶

  • /dev/zero

输入设备, 可用于向设备或文件无限写入字符串0, 初始化文件