Question

Je suis en train de communiquer avec un lecteur de disque à l'aide INB (), inw (), NUM.B () et outw () commandes afin que je puisse trouver des informations spécifiques sur le lecteur. Toutefois, pour utiliser ces commandes, j'ai besoin des ports d'E / S correct pour le périphérique. Quand j'ai les ports d'E / S correct, je peux trouver l'information que je cherche très facilement, cependant, je ne sais pas un moyen de trouver l'adresse de base des ports d'E / S d'un périphérique sous Linux.

Dans DOS, je suis en mesure d'utiliser Hdat2 pour trouver l'adresse de base de l'appareil, mais je suis en train de trouver l'adresse sous Linux. Est-il un moyen de trouver les cartes de périphériques auxquels port E / S sous Linux?

Il y a un fichier dans / proc appelé ioports qui contient des informations, mais je ne sais pas comment associer ces informations avec des périphériques spécifiques.

Toute aide serait grandement appréciée. Merci!

Était-ce utile?

La solution

J'ai trouvé quelque chose, même si ce n'est pas la solution la plus élégante et il ne fonctionne pas vraiment partout, il a travaillé sur mon matériel, donc je pensais que je voudrais partager.

D'abord, vous devez obtenir l'adresse du contrôleur SATA de la commande lspci comme Nikolai a montré (-D montre juste les numéros complets de domaine):

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

Maintenant, avec cette adresse (0000: 00: 1f.2) vous pouvez aller dans / sys.

/ sys / bus / pci / devices, votre appareil doit être répertorié:

# 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

dans ce répertoire il y aura plusieurs répertoires 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
...

Dans un de ces répertoires HostX, il y aura un targetX: répertoire X: X. Ce targetX: répertoire X: X aura alors un répertoire appelé X: X: X: X (les X sont des nombres qui peuvent varier)

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

Dans le X: X: X: répertoire X, il existe un lien nommé "bloc: sdX" (où X est une lettre). Ce sdX est le nom du lecteur que ce répertoire correspond à.

# 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 correspond à l'hôte 0 sur le contrôleur SATA à 0000: 00: 1f.2. Maintenant, pour trouver l'adresse que nous pouvons utiliser pour parler / dev / sda par INB () et NUM.B () commandes, nous regardons dans le fichier nommé « ressource » dans / 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

L'adresse que nous cherchons est FE00, qui est sur la première ligne. Nous voulons que la première ligne, car il est l'hôte 0, si elle était l'hôte 1, nous sommes sur la deuxième ligne, et l'hôte 2 la troisième ligne, et ainsi de suite. Le numéro d'hôte a été donné par le répertoire hostX que nous avons trouvé plus tôt. Chaque ligne du fichier de ressources est séparé en 3 colonnes:

Colonne 1 = adresse de début Colonne 2 = adresse de fin Colonne 3 = drapeaux

Alors voilà comment je reçois de / dev / sda à 0xfe00 afin d'envoyer des commandes au périphérique.

Si quelqu'un sait quelle meilleure façon de le faire, je suis toutes les oreilles ...

Autres conseils

Le dispositif est très probablement pendait du bus PCI, donc lspci(8) est le premier à regarder. Ensuite, savoir où en /sys le contrôleur est décrit. Ici, par exemple, j'ai:


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

Cela montre l'espace de configuration PCI du contrôleur. Voir les détails dans pilotes de périphériques Linux, troisième édition. Chapitre 12:. Pilotes PCI

Edit:

Jetez un coup d'oeil dans cette et masse- stockage nommant howto de l'aide sur le nommage de lecteur Linux.

Êtes-vous l'accès au matériel d'un programme ou d'un espace utilisateur module de noyau?

Si vous faites à partir du userspace, la raison pour laquelle il est difficile de trouver des informations d'adresse physique est que personne accède au matériel de cette façon; tout ce qui a besoin de toucher le matériel brut vit dans le noyau.

Si vous écrivez un module de noyau, vous obtenez des informations d'adresse des structures dans le noyau, et non en accédant /sys/...

Le chemin semble avoir par hasard dans le noyau 3.10, voilà comment je trouve le nœud de périphérique correspondant:

$ 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top