所以我确实找到了一些东西,虽然它不是最优雅的解决方案,而且它肯定不能在任何地方工作,但它已经在我的硬件上工作了,所以我想我会分享。
首先,您必须像 Nikolai 显示的那样从 lspci 命令获取 SATA 控制器的地址(-D 只显示完整的域号):
# lspci -D
...
0000:00:1f.2 SATA controller: Intel Corporation 82801IR 6 port SATA AHCI Controller
...
现在有了这个地址 (0000:00:1f.2),你可以进入 /sys。
在 /sys/bus/pci/devices 中,应列出您的设备:
# ls -l /sys/bus/pci/devices
...
lrwxrwxrwx 1 root root 0 Jan 14 12:35 0000:00:1f.2 -> ../../../devices/pci0000:00/0000:00:1f.2
现在在这个目录中会有几个 hostX 目录。
# ls -l /sys/bus/pci/devices/0000\:00\:1f.2/
...
drwxr-xr-x 4 root root 0 Jan 13 12:40 host0
drwxr-xr-x 4 root root 0 Jan 13 12:40 host1
drwxr-xr-x 3 root root 0 Jan 13 12:40 host2
drwxr-xr-x 3 root root 0 Jan 13 12:40 host3
drwxr-xr-x 3 root root 0 Jan 13 12:40 host4
drwxr-xr-x 4 root root 0 Jan 14 08:21 host5
...
在这些 hostX 目录之一中,将有一个 targetX:X:X 目录。这个 targetX:X:X 目录将有一个名为 X:X:X:X 的目录(X 是可以变化的数字)。
# ls -R /sys/bus/pci/devices/0000\:00\:1f.2/host0
/sys/bus/pci/devices/0000:00:1f.2/host0:
power scsi_host:host0 target0:0:0 uevent
/sys/bus/pci/devices/0000:00:1f.2/host0/target0:0:0:
0:0:0:0 power uevent
...
在 X:X:X:X 目录中,有一个名为“block:sdX”的链接(其中 X 是一个字母)。这个sdX就是这个目录对应的驱动器的名字。
# ls -l /sys/bus/pci/devices/0000\:00\:1f.2/host0/target0\:0\:0/0\:0\:0\:0/
lrwxrwxrwx 1 root root 0 Jan 14 15:01 block:sda -> ../../../../../../block/sda
因此 /dev/sda 对应于 SATA 控制器上的主机 0,位于 0000:00:1f.2。现在要找到可以通过 inb() 和 outb() 命令与 /dev/sda 通信的地址,我们在 /sys/bus/pci/devices/0000:00:1f 中查找名为“resource”的文件.2/.
# cat /sys/bus/pci/devices/0000\:00\:1f.2/resource
0x000000000000fe00 0x000000000000fe07 0x0000000000000101
0x000000000000fe10 0x000000000000fe13 0x0000000000000101
0x000000000000fe20 0x000000000000fe27 0x0000000000000101
0x000000000000fe30 0x000000000000fe33 0x0000000000000101
0x000000000000fec0 0x000000000000fedf 0x0000000000000101
0x00000000ff970000 0x00000000ff9707ff 0x0000000000000200
0x0000000000000000 0x0000000000000000 0x0000000000000000
我们要找的地址是fe00,在第一行。我们想要第一行,因为它是主机 0,如果是主机 1,我们将查看第二行,主机 2 查找第三行,依此类推。主机号由我们之前找到的 hostX 目录给出。资源文件中的每一行分为 3 列:
第 1 列 = 起始地址 第 2 列 = 结束地址 第 3 列 = 标志
所以这就是我从 /dev/sda 到 0xfe00 以便向设备发送命令的方式。
如果有人知道任何更好的方法来做到这一点,我全神贯注......