在应用层,可以调用fopen()方法。
fwrite()方法会调用系统调用open()。
当操作系统接收到open()调用时,它将把命令传递给虚拟文件系统(VFS)。
VFS查找包括所需任何目录的文件名,并执行必要的访问检查。
如果在RAM缓存中,则不需要磁盘访问。如果没有,则VFS会向特定的文件系统发送读取请求,该文件系统可能是EXT4。
然后,EXT4文件系统驱动程序将确定该目录位于哪个磁盘块中。然后将向磁盘设备驱动程序发送读取命令。
现在假设我想读取连接到板上的i2c设备A。文件目录为/dev/i2c/A。
所有设备是否都有一个主编号?例如,Linux OS设置USB的主编号为180.那么在设备端,每个USB设备是否都有180的主编号?
如果第一题的答案是否定的,那么Linux OS如何确定device A的类型,只是根据文件目录吗?
我认为第二个问题的答案可能是:在引导初始化阶段,已经有一些特定代码使用类似export()的东西将该端口挂载到文件系统中。所以事实上,在引导阶段之后,文件目录/dev/i2c/A会存在,并与i2c设备的主编号绑定。因此,当我想打开dev/i2c/A时,操作系统将为我找到正确的i2c驱动程序,而不是SPI或USB驱动程序。我对这部分不太确定,需要更多的信息。
在设备挂载到文件系统之后,如果我有一个usb,它如何被挂载到文件系统并具有正确的180主编号?我猜在挂载阶段开始之前,插入usb时会发生中断?
/dev/
树中特定路径下将打开哪个驱动程序”。而关于“为设备选择哪个驱动程序”的问题完全不同:即通过启发式探测或借助“即插即用”系统来识别外围设备。 - Kaz