c - 如何找到块设备的 scsi_host_template 函数?
问题描述
我正在查看 Linux 内核的 IO 路径,在函数的底部,scsi_dispatch_cmd()
调用了驱动程序代码
rtn = host->hostt->queuecommand(host, cmd);
所以,对于我的块设备/dev/sda/
,有没有办法找出它正在使用哪个hostt
或scsi_host_template
它正在使用。我想检查哪个函数queuecommand
指向..
解决方案
就像对这个主题的反思一样。
在我的 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
在这种特殊情况下,我们可以看到 queuecommand 和提到的驱动器之间的关系:
$ grep queuecommand /proc/kallsyms
ffffffffc052be60 t uas_queuecommand [uas]
ffffffffc0582ad0 t queuecommand [usb_storage]
现在,在 Linux 源目录中:
$ grep -rnI '\.queuecommand =' | grep usb
drivers/usb/storage/uas.c:846: .queuecommand = uas_queuecommand,
drivers/usb/storage/scsiglue.c:609: .queuecommand = queuecommand,
希望这会帮助你。
推荐阅读
- vb.net - 某个月的天数
- android - 在google place api中获取位置超时?
- javascript - Vue计算问题-何时再次计算
- orleans - ASP.NET Core 项目中的奥尔良直接客户端
- node.js - Promise.all 使用填充创建的 Promise 数组只执行一次
- python - 尝试使用 'django.db.backends.XXX',其中 XXX 是以下之一:
- java - 类型参数“S”的推断类型“S”不在其范围内;应该扩展“com.example.srilanka.model.Employee”
- reactjs - 通过 React 显示数据
- javascript - Magento 2.1.9 Javascript 文件在迁移后抛出错误
- iframe - 将 chrome 扩展内容脚本注入动态实例化的 iframe