gpt4 book ai didi

linux-kernel - '/dev' 中的文件如何匹配 Linux 的设备型号?

转载 作者:行者123 更新时间:2023-12-04 04:20:11 25 4
gpt4 key购买 nike

这是我对打开文件进行读/写的理解。

在应用层,我可以调用fopen()函数。

fwrite() 函数将调用系统调用 open()

操作系统收到open()调用后,会将命令传递给VFS(虚拟文件系统)。

VFS 查找文件名,包括所需的任何目录并进行必要的访问检查。

如果这是在 RAM 缓存中,则不需要磁盘访问。如果没有,VFS 会向可能是 EXT4 的特定文件系统发送读取请求。

然后 EXT4 文件系统驱动程序将确定该目录位于哪个磁盘 block 中。然后它将向磁盘设备驱动程序发送读取命令。


所以现在假设我想读取连接到板上的 i2c 设备 A。并且文件目录是/dev/i2c/A

  • 是否有适用于所有设备的主设备编号?例如,Linux 操作系统将 180 设置为 USB 的主编号。那么在设备方​​面,每个 USB 设备中是否有一个主编号 180?

  • 如果第一个问题的答案是否定的,那么Linux操作系统如何判断设备A是哪种类型,仅仅是根据文件目录吗?

  • 我认为第二个问题的答案可能是:在启动初始化阶段,有一些代码已经使用 export() 之类的方法将该端口挂载到文件系统?所以事实上,在启动阶段之后,文件目录 /dev/i2c/A 就存在在那里,并且它与 i2c 设备的主设备号绑定(bind)。所以当我想打开 dev/i2c/A 时,操作系统会为我找到正确的 i2c 驱动程序,而不是 SPI 或 USB 驱动程序。我不确定这部分,我需要更多信息。

  • 当设备在启动阶段后立即挂载到文件系统时,会发生上述情况。那么如果我有一个 USB 会发生什么,这个 USB 插入后如何以正确的主编号 180 安装到文件系统?而且我猜在安装阶段开始之前插入usb时会有一个irq?

最佳答案

见:hotplug doc .如果您运行示例代码,您可以看到在从 USB 添加/删除设备时发送了一个 netlink 事件。这是 driver model 的一部分.每个驱动程序都应该附加到一个BUS;这可以是 platformUSBI2CSPIPCI 等。同样,在 sysfs 中,会有用于识别特定设备的条目。通常是 I2C地址可用于识别特定的客户端/从属芯片。 驱动程序模型还有助于挂起、恢复、有序关闭等。

/dev/ 中的文件是由 udevmdevuser-space 程序创建的。它们将名称与设备节点(主要、次要、字符/ block )相关联。您可以使用 sysfs 和/或您的 udev 脚本根据 netlink 信息创建您想要的设备名称;其中大部分可用于 udev 脚本。

编辑: 对于 i2c,总线主控驱动程序通过运行 probe注意 1 来发现设备的地址.设备与具有表的特定驱动程序相关联。例如,stargate machine fileimote2_i2c_board_infoi2c 地址与驱动程序相关联。 SPI 设备也有类似的表。 Platform注 2 设备是通过 platform_add_devices() 添加的。 USBPCI 设备由类似的设备的 BUS 特定 id 标识。通常一个机器文件(或最近的设备树)将两者关联起来。
另见:Linux Journal - I2C Drivers pt1 , Linux Journal - I2C Drivers pt2

我认为造成混淆的原因在于,所有驱动程序/设备都是您在 /dev/ 目录中看到的驱动程序/设备。这不是真的。用户只能看到顶级驱动程序。 master 设备使用许多 Linux 驱动程序/设备。它们可以形成设备的层次结构。通常只有顶级设备会暴露给用户。有诸如 spi_write() 之类的函数,更高级别的驱动程序可以使用它们通过 SPI 进行通信,SPI 设备不会暴露给 用户空间。声音和媒体/电视采集卡通常使用 SPI 设备,但用户永远不知道该 BUS 存在并且正在使用。通常,多个卡供应商会在下面使用相同的芯片组。无需为每张卡编写驱动程序,只需为卡编写一些胶水。然后使用 chip 驱动程序的通用集合与 glue 一起在层次结构的顶部将它们捆绑在一起;这是暴露给用户空间的顶级驱动程序。这也允许 smartTM 芯片供应商创建系统集成商可以使用的良好驱动程序。

注 1: i2c 探测,我的意思是一个 I2C 消息,它请求总线上的所有注册地址。我不确定 probe 是否是正确的 i2c 命名法。

注 2 Platform 设备是 SOC设备。他们没有相关的 BUS,所以平台是一个包罗万象的东西。通常,platform 设备与 CPU 集成在一起(SOC 代表片上系统)。

关于linux-kernel - '/dev' 中的文件如何匹配 Linux 的设备型号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14972584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com