3

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

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

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

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

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

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

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


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

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

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

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

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

4

2 回答 2

8

请参阅:热插拔文档。如果您运行示例代码,您可以看到netlink在添加/删除设备时发送了一个事件USB。这是驱动模型的一部分。每个驱动程序都应附加到一个BUS; 这可以是platform, USB, I2C, SPI,PCI等。同样,在 中sysfs,将有用于识别特定设备的条目。通常I2C可以使用地址来识别特定的客户端/从属芯片。驱动模型还便于挂起、恢复、有序关闭等。

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

编辑:对于i2c总线主驱动程序,通过运行probeNote 1来发现设备的地址。设备与具有表的特定驱动程序相关联。例如,stargate 机器文件将地址与驱动程序imote2_i2c_board_info相关联。i2c设备也有类似的表SPIPlatform注 2设备以platform_add_devices(). USBPCI设备由设备的类似BUS特定 ID 标识。通常一个机器文件(或最近device tree的)将两者关联起来。
另请参阅:Linux 日志 - I2C 驱动程序 pt1Linux 日志 - I2C 驱动程序 pt2

我认为混淆的根源是所有驱动程序/设备都是您在/dev/目录中看到的那些。这不是真的。用户只能看到顶级驱动程序。许多 Linux 驱动程序/设备由设备使用。它们可以形成设备的层次结构。通常只有顶层设备暴露给用户。有一些功能,例如spi_write(),更高级别的驱动程序可以用来通过SPISPI设备不接触user space。声音和媒体/电视采集卡经常使用SPI设备,但用户永远不知道这一点BUS存在并被使用。通常,多个卡供应商会在下面使用相同的芯片组。不是为每张卡编写驱动程序,而是只为卡编写一些胶水。然后一个通用的chip驱动程序集合与胶水一起使用,在层次结构的顶部将它们捆绑在一起;这是暴露于user space. 这也允许智能TM芯片供应商创建系统集成商可以使用的良好驱动程序。

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

Note 2 Platform devices are SOC devices. They have no associated BUS, so platform is a catch-all. Typically, platform devices are integrated with the CPU (SOC stands for system on chip).

于 2013-02-20T23:28:27.830 回答
1

每个设备都有一个主要和次要编号。您可以通过执行来查看它们 ls -n /dev 对于某些驱动程序,例如磁盘,主要数字是硬编码的。对于其他人来说,它是动态的。次要编号可以在运行时发现设备时动态分配,而不仅仅是在启动时。内核维护一个内部设备切换表,将开发号映射到正确的驱动程序。

于 2013-02-20T05:14:30.403 回答