这是我对打开文件进行读/写的理解。
在应用层,我可以调用该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时会有一个中断?