我在查看Linux内核的IO路径,在最下面的函数中的 scsi_dispatch_cmd()
驱动程序代码被调用
rtn = host->hostt->queuecommand(host, cmd);
所以,对于我这样的块状设备 /dev/sda/
有什么方法可以找到哪些 hostt
或 scsi_host_template
它正在使用。我想检查一下哪个函数 queuecommand
是指向...
只是作为对这个问题的思考草图。在我的U盘的机器上,我可以看到这样的情况。
$ ls -l /dev/sdg
brw-rw---- 1 root disk 8, 96 Apr 27 01:21 /dev/sdg
$ ll /sys/dev/block/8\:96/device/drive
lrwxrwxrwx 1 root root 0 Apr 27 01:32 /sys/dev/block/8:96/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
通常这种块状设备是通过常规的... Linux scsi磁盘驱动器. 这与usb处理有关。
$ lsmod | grep sd
sd_mod 49152 13
scsi_mod 225280 5 sd_mod,usb_storage,libata,uas,sg
在这个特殊的情况下,我们可以看到队列命令和所述驱动器之间的关系。
$ grep queuecommand /proc/kallsyms
ffffffffc052be60 t uas_queuecommand [uas]
ffffffffc0582ad0 t queuecommand [usb_storage]
现在,在Linux的源码目录下,我们可以看到queuecommand和所述驱动器之间的关系。
$ grep -rnI '\.queuecommand =' | grep usb
drivers/usb/storage/uas.c:846: .queuecommand = uas_queuecommand,
drivers/usb/storage/scsiglue.c:609: .queuecommand = queuecommand,
希望能帮到你