【发布时间】:2019-08-18 12:38:05
【问题描述】:
这是我对打开文件进行读/写的理解。
在应用层,我可以调用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时会有一个irq?
【问题讨论】:
-
此问题的标题与内容不符。内容是关于Linux 如何确定为
/dev/树中的特定路径打开哪个驱动程序。 为设备选择什么驱动程序的问题完全不同:即通过启发式探测或借助“即插即用”系统来识别外围设备。 -
A very similar question 也已关闭。
标签: linux-kernel linux-device-driver embedded-linux