4

ドライブに関する特定の情報を見つけることができるように、inb()、inw()、outb()、および outw() コマンドを使用してディスク ドライブと通信しようとしています。ただし、これらのコマンドを使用するには、デバイスの正しい I/O ポートが必要です。正しい I/O ポートがあれば、探している情報を簡単に見つけることができますが、Linux でデバイスの I/O ポートのベース アドレスを見つける方法がわかりません。

DOS では、Hdat2 を使用してデバイスのベース アドレスを見つけることができますが、Linux でアドレスを見つけようとしています。Linux でどのデバイスがどの I/O ポートにマップされているかを調べる方法はありますか?

/proc には ioports というファイルがあり、いくつかの情報が含まれていますが、この情報を特定のデバイスに関連付ける方法はわかりません。

どんな助けでも大歓迎です。ありがとう!

4

4 に答える 4

4

だから私は何かを見つけましたが、それは最もエレガントなソリューションではなく、どこでも機能するわけではありませんが、私のハードウェアで機能したので共有したいと思いました.

まず、ニコライが示したように 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 に移動する方法です。

誰かがこれを行うためのより良い方法を知っているなら、私はすべて耳を傾けています...

于 2010-01-14T20:19:30.307 に答える
1

ユーザースペースプログラムまたはカーネルモジュールからハードウェアにアクセスしていますか?

ユーザースペースから実行している場合、物理アドレス情報を見つけるのが難しい理由は、誰もその方法でハードウェアにアクセスしないためです。生のハードウェアに触れる必要があるものはすべてカーネルに存在します。

カーネルモジュールを作成している場合は、アクセスするのではなく、カーネル内の構造からアドレス情報を取得します。/sys/...

于 2010-01-08T01:13:03.130 に答える
1

デバイスが PCI バスからぶら下がっている可能性が高いためlspci(8)、最初に確認します。次に/sys、コントローラーの下のどこに記述されているかを調べます。たとえば、次のようなものがあります。


~$ lspci
...
03:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS 1078 (rev 04)
...
~$ ll /sys/bus/pci/devices/0000\:03\:00.0/
total 0
drwxr-xr-x 4 root root      0 Dec 16 11:57 ./
drwxr-xr-x 6 root root      0 Dec 16 11:57 ../
-rw-r--r-- 1 root root   4096 Dec 16 11:57 broken_parity_status
lrwxrwxrwx 1 root root      0 Dec 16 11:57 bus -> ../../../../bus/pci/
-r--r--r-- 1 root root   4096 Dec 16 11:57 class
-rw-r--r-- 1 root root   4096 Dec 16 11:57 config
-r--r--r-- 1 root root   4096 Dec 16 11:57 device
lrwxrwxrwx 1 root root      0 Dec 16 11:57 driver -> ../../../../bus/pci/drivers/megaraid_sas/
-rw------- 1 root root   4096 Dec 16 11:57 enable
drwxr-xr-x 5 root root      0 Dec 16 11:57 host0/
-r--r--r-- 1 root root   4096 Dec 16 11:57 irq
-r--r--r-- 1 root root   4096 Dec 16 11:57 local_cpus
-r--r--r-- 1 root root   4096 Dec 16 11:57 modalias
-r--r--r-- 1 root root   4096 Dec 16 11:57 pools
drwxr-xr-x 2 root root      0 Dec 16 11:57 power/
-r--r--r-- 1 root root   4096 Dec 16 11:57 resource
-rw------- 1 root root 262144 Dec 16 11:57 resource0
-rw------- 1 root root    256 Dec 16 11:57 resource2
-rw------- 1 root root 262144 Dec 16 11:57 resource3
-r-------- 1 root root  32768 Dec 16 11:57 rom
lrwxrwxrwx 1 root root      0 Dec 16 11:57 subsystem -> ../../../../bus/pci/
-r--r--r-- 1 root root   4096 Dec 16 11:57 subsystem_device
-r--r--r-- 1 root root   4096 Dec 16 11:57 subsystem_vendor
--w------- 1 root root   4096 Dec 16 11:57 uevent
-r--r--r-- 1 root root   4096 Dec 16 11:57 vendor

これは、コントローラーの PCI 構成スペースを示しています。詳細については、Linux Device Drivers, Third Edition を参照してください。第 12 章: PCI ドライバー

編集:

Linux ドライブの名前付けについては、このパーティションと大容量ストレージの名前付けのハウツーを参照してください。

于 2010-01-04T17:11:30.567 に答える
1

パスはカーネル 3.10 で変更されたようです。対応するデバイス ノードを見つける方法は次のとおりです。

$ ls -l /sys/bus/pci/devices/0000\:00\:1f.2/ata1/host0/target0\:0\:0/0\:0\:0\:0/block/
total 0
drwxr-xr-x 10 root root 0 Oct 17 08:35 sda

$ ls -l /sys/bus/pci/devices/0000\:00\:1f.2/ata2/host1/target1\:0\:0/1\:0\:0\:0/block/
total 0
drwxr-xr-x 9 root root 0 Oct 17 08:35 sdb
于 2013-10-17T01:18:45.377 に答える