对于我的一个应用程序,我必须了解 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
,它连接到ata1
PCI 设备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
。