繁体   English   中英

LInux 设备驱动分层混淆

[英]LInux Device Driver Layering Confusion

我最近一直在阅读有关 Linux 驱动程序和设备 Model 的信息。 我想了解驱动子系统中 linux 中的以下工作原理。 所以可以说我的设备树如下所示

在此处输入图像描述

具体来说,假设 Bus1 是 PCI 总线,Bus2 是 ISA,Bus3 是 USB。 公共汽车使用桥梁相互连接。

Linux 将通过枚举过程识别此设备树,并通过枚举和探测机制识别适合终端设备的 usb 驱动程序。

现在让我们假设对该终端设备进行 Tx 操作。 终端设备 usb 驱动程序最终会执行 urb_submit(dev, write_buffer)。

我的问题是为了让 URB 到达终端设备,理论上它必须被包裹在 Bus2 和 Bus1 信封中。 所以从理论上讲,传出数据包必须看起来像这样

在此处输入图像描述

因此,在驱动程序中发生 urb_submit 之后,一些 kernel 代码是否会沿着设备树结构并依次调用总线驱动程序(总线 2 驱动程序和总线 1 驱动程序)来创建这个包络结构。

谁能指出发生这种情况的 linux kernel 中的代码? 我试图关注 urb_submit 但无法弄清楚。

非常感谢!

对于具有内存映射寄存器的设备驱动程序,设备的私有数据结构包含通过枚举为每个设备分配的地址,并且它们直接写入寄存器。

对于 go 通过层的设备驱动程序,如上所述,枚举告诉每个驱动程序其父级是谁,并且驱动程序在实例化时将其保存在其私有数据中。 然后驱动程序的读取或写入调用为设备类型正确格式化请求并调用父驱动程序的读取或写入方法。 例如,USB 磁盘读取可能会调用其父级的 file_operations 块中的读取方法,即https://elixir.bootlin.com/linux/v4.19.107/source/drivers/usb/core/devio.c# L2614

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM