Итак, я нашел что-то, хотя это не самое элегантное решение, и оно определенно не работает везде, оно работало на моем оборудовании, поэтому я решил, что поделюсь.
Во-первых, вы должны получить адрес контроллера SATA из команды lspci, как показал Николай (ключ -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 соответствует хосту 0 на контроллере SATA в 0000: 00: 1f.2. Теперь, чтобы найти адрес, который мы можем использовать для общения с / dev / sda с помощью команд inb () и outb (), мы смотрим в файле с именем «resource» в / sys / bus / pci / devices / 0000: 00: 1f 0,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 для отправки команд на устройство.
Если кто-нибудь знает лучший способ сделать это, я весь в ушах ...