Domanda

Sto cercando di comunicare con unità disco con inb (), inw (), outb () e OUTW () comandi in modo da poter trovare le informazioni specifiche relative all'unità. Tuttavia, per utilizzare questi comandi, devo porte di I / O corretti per il dispositivo. Quando ho le porte I / O corretto, posso trovare le informazioni che sto cercando molto facilmente, tuttavia, non so un modo per trovare l'indirizzo di base di porte I / O di un dispositivo in Linux.

In DOS, sono in grado di utilizzare Hdat2 per trovare l'indirizzo di base del dispositivo, però, sto cercando di trovare l'indirizzo in Linux. C'è un modo per trovare le mappe quale dispositivo a cui porta di I / O in Linux?

C'è un file in / proc chiamato ioports che contiene alcune informazioni, ma io non come associare queste informazioni con dispositivi specifici.

Qualsiasi aiuto sarebbe molto apprezzato. Grazie!

È stato utile?

Soluzione

Così ho fatto trovare qualcosa, anche se non è la soluzione più elegante e sicuramente non funziona in tutto il mondo, ha lavorato sul mio hardware così ho pensato che avrei condiviso.

In primo luogo, è necessario ottenere l'indirizzo del controller SATA dal comando lspci come Nikolai ha mostrato (il -D mostra solo i numeri di dominio completi):

# lspci -D
...
0000:00:1f.2 SATA controller: Intel Corporation 82801IR 6 port SATA AHCI Controller
...

Ora, con questo indirizzo (0000: 00: 1f.2) si può andare in / sys.

/ sys / bus / pci / dispositivi, il dispositivo dovrebbe essere elencato:

# 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

Ora, in questa directory ci saranno diverse directory 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
...

In una di queste directory hostx, ci sarà un TargetX: directory X: X. Questo TargetX: X: directory X avrà quindi una directory chiamata X: X: X: X (le X sono numeri che possono variare)

.
# 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
...

Nel X: X: X: directory X, c'è un link chiamato "blocco: sdX" (dove X è una lettera). Questo sdX è il nome dell'unità che questa directory corrisponde.

# 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 corrisponde ad ospitare 0 sul controller SATA a 0000: 00: 1f.2. Ora per trovare l'indirizzo che possiamo usare per parlare con / dev / sda attraverso inb () e outb () Comandi, guardiamo nel file chiamato "risorsa" in / sys / bus / pci / devices / 0000: 00: 1F .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

L'indirizzo che stiamo cercando è FE00, che si trova sulla prima linea. Vogliamo che la prima linea, perché è ospite 0, se si trattasse di host 1, avremmo guardare sulla seconda linea, e ospite 2 la terza linea, e così via. Il numero di host è stato dato dalla directory hostX che abbiamo trovato in precedenza. Ogni riga nel file di risorse è suddivisa in 3 colonne:

Colonna 1 = Indirizzo di inizio Colonna 2 = indirizzo finale Colonna 3 = bandiere

Quindi questo è come mi da / dev / sda a 0xfe00 al fine di inviare comandi al dispositivo.

Se qualcuno conosce un modo migliore per fare questo, io sono tutto orecchie ...

Altri suggerimenti

Il dispositivo è molto probabilmente appeso fuori del bus PCI, in modo lspci(8) è il primo a guardare. Quindi capire dove sotto /sys viene descritto il controllore. Qui, per esempio, ho:


~$ 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

Questo dimostra spazio di configurazione PCI del controller. Vedere i dettagli in Linux Device Drivers, terza edizione. Capitolo 12:. Driver PCI

Modifica:

Date un'occhiata a questo e produrre in serie stoccaggio denominazione howto per un aiuto su di denominazione dell'unità Linux.

Stai accedendo hardware da un programma userspace o da un modulo del kernel?

Se stai facendo dallo userspace, il motivo è difficile trovare le informazioni indirizzo fisico è che nessuno accede hardware che modo; tutto ciò che ha bisogno di toccare l'hardware grezzo vive nel kernel.

Se si sta scrivendo un modulo del kernel, si ottiene affrontare informazioni dalle strutture in-kernel, non accedendo /sys/...

Il percorso sembra essere capitato nel kernel 3.10, questo è come trovo il nodo del dispositivo corrispondente:

$ 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top