如何在Linux上找到与SATA设备关联的驱动程序(模块)?

如何在Linux上找到与SATA设备关联的驱动程序(模块)?

对于我的一个应用程序,我必须了解 SATA 设备驱动程序流程。根据我的理解,SATA设备驱动程序应该存在于Linux内核树中。我已经提到过如何在 Linux 上查找与设备关联的驱动程序模块查找 SATA 设备的设备驱动程序。

$ readlink /sys/block/sda/device/driver ../../../../../../../bus/scsi/d

我已转到上述位置,但尚未找到设备驱动程序文件。

usr@usr:/sys/bus/scsi/drivers/sd$ ll
total 0
drwxr-xr-x 2 root root    0 Dec  9 17:00 ./
drwxr-xr-x 4 root root    0 Dec  9 17:00 ../
lrwxrwxrwx 1 root root    0 Dec  9 17:47 2:0:1:0 -> ../../../../devices/pci0000:00/0000:00:1f.2/ata3/host2/target2:0:1/2:0:1:0/
--w------- 1 root root 4096 Dec  9 17:47 bind
--w------- 1 root root 4096 Dec  9 17:47 uevent
--w------- 1 root root 4096 Dec  9 17:47 unbind
usr@usr:/sys/bus/scsi/drivers/sd$ 

请建议我如何查看系统上实际为 SATA 硬盘加载的设备驱动程序。

答案1

udevadm info按照您提到的链接的另一个答案中的描述使用。这是一个使用不同的 grep 变体来减少输出的示例,同时/sys向后遍历树:

$ udevadm info -a -n /dev/sda | egrep 'looking|DRIVER'
  looking at device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda':
    DRIVER==""
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0':
    DRIVERS=="sd"
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0':
    DRIVERS==""
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0':
    DRIVERS==""
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1':
    DRIVERS==""
  looking at parent device '/devices/pci0000:00/0000:00:1f.2':
    DRIVERS=="ahci"
  looking at parent device '/devices/pci0000:00':
    DRIVERS==""

所以你可以看到在我的系统上,/dev/sda映射到 SCSI 设备0:0:0:0,它连接到ata1PCI 设备0:00:1f.2(这是主机适配器)

驱动程序sd负责处理块设备,而驱动程序ahci负责处理SATA主机适配器。

答案2

这仅尝试回答部分问题,即如何查找内核驱动程序代码。我本想将其添加为注释,但它太长了。

首先安装 Debian 内核源码包。

apt-get install linux-source-3.16

或者无论您的内核的相应版本是什么。然后将源安装到/usr/src/linux-source-3.16.tar.xz.

现在创建/usr/local/src/linux目录并将源代码复制到那里。即:

mkdir /usr/local/src/linux 

其次是

cp -ar /usr/src/linux-source-3.16.tar.xz /usr/local/src/linux

现在你可以用 tar 解压它。

tar xvf linux-source-3.16.tar.xz 
cd linux-source-3.16

然后运行find您所需的设备驱动程序,例如:

/usr/local/src/linux/linux-source-3.16$ find . -name 'sg.c'
./drivers/scsi/sg.c

所以有问题的司机是在

/usr/local/src/linux/linux-source-3.16/drivers/scsi/sg.c

中列出的所有模块lsmod都应位于源代码树中,格式为modname.c,其中modname是列表中出现的名称lsmod

相关内容