だから私は何かを見つけましたが、それは最もエレガントなソリューションではなく、どこでも機能するわけではありませんが、私のハードウェアで機能したので共有したいと思いました.
まず、ニコライが示したように 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 ディレクトリの 1 つに、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 は 0000:00:1f.2 の SATA コントローラのホスト 0 に対応します。/sys/bus/pci/devices/0000:00:1f 内の「resource」という名前のファイルを調べて、inb() および outb() コマンドを使用して /dev/sda と対話するために使用できるアドレスを見つけます。 .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 行目、ホスト 2 は 3 行目などとなります。ホスト番号は、先ほど見つけた hostX ディレクトリによって与えられました。リソース ファイルの各行は、次の 3 つの列に分かれています。
列 1 = 開始アドレス 列 2 = 終了アドレス 列 3 = フラグ
これは、コマンドをデバイスに送信するために /dev/sda から 0xfe00 に移動する方法です。
誰かがこれを行うためのより良い方法を知っているなら、私はすべて耳を傾けています...