我在查看Linux内核的IO路径,然后在函数scsi_dispatch_cmd()的底部调用驱动程序代码。
rtn = host->hostt->queuecommand(host, cmd);因此,对于像/dev/sda/这样的块设备,有什么方法可以找出它在使用哪个hostt或scsi_host_template。我想检查queuecommand指向哪个函数..。
发布于 2020-04-26 23:03:06
就像一个关于这个问题的思考草图。
在我的USB驱动器机器中,我可以看到以下内容:
$ 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源代码dir中:
$ grep -rnI '\.queuecommand =' | grep usb
drivers/usb/storage/uas.c:846: .queuecommand = uas_queuecommand,
drivers/usb/storage/scsiglue.c:609: .queuecommand = queuecommand,希望这能帮到你。
https://stackoverflow.com/questions/61435182
复制相似问题