Table des matières
Se familiariser avec les notions de base de l’architecture matérielle des ordinateurs.
Les ordinateurs de type PC ont des éléments fonctionnellement semblables bien qu’ils soient de modèles différents ou fabriqués par des constructeurs différents.
BIOS, CPU, mémoire, ROM, RAM, bus, dmesg
Les ordinateurs de type PC sont constitués d’un ensemble de composants assurant des fonctions semblables.
Le processeur est un circuit électronique qui assure les fonctions centrales de l’ordinateur. C’est lui qui exécute les instructions constituant les différentes tâches demandées à l’ordinateur.
Les mémoires sont des composants électroniques pouvant garder des informations temporairement ou à long terme. Les mémoires centrales sont utilisées pour stocker les informations nécessitant un accès rapide par le processeur. On distingue les mémoires vives (Random Access Memory ou RAM) et les mémoires mortes (Read Only Memory ou ROM). Les mémoires de masse sont utilisées pour stocker les informations à plus long terme comme les disques, les disquettes (cf. section « disques »).
Le BIOS est un petit programme qui réside en mémoire morte et qui, après la mise sous tension de l’ordinateur, effectue un inventaire et un test des matériels présents. Il permet également, selon les versions, de les paramétrer.
L’unité centrale d’un PC communique avec les contrôleurs de périphériques par le biais des bus. Un contrôleur de périphérique permet de piloter plusieurs périphériques qui lui sont rattachés.
Les disques sont des périphériques de stockage. On peut citer les disques durs, les disquettes, les cédéroms, le DVD-ROM, etc.
Dans les noyaux 2.6 et grâce à la combinaison des systèmes de fichiers virtuels /proc et /sys, il est possible d’obtenir un instantané du système et de toutes ses périphériques.
ISA, PCI, AGP, IRQ, DMA (canaux), /proc, /sys, lspci, lsusb, udev
Un PC utilise généralement plusieurs types de bus :
Un système informatique alloue des ressources aux différents contrôleurs de périphériques afin qu’elles puissent communiquer avec lui.
Lorsqu’un périphérique veut communiquer avec le processeur, il envoie une interruption. Cette interruption déclenche l’exécution d’un sous-programme du pilote du périphérique qui va demander du temps CPU. Le CPU interrompra alors l’activité en cours pour exécuter les demandes du périphérique. Ces interruptions sont identifiées par un numéro, l’IRQ (Interrupt Request Number), qui varie de 0 à 15.
Les canaux DMA (Direct Memory Access) permettent à un contrôleur de périphérique de transférer les données directement à la mémoire sans passer par le CPU. Ces canaux améliorent la performance dans la mesure où ils permettent des transferts rapides parfois simultanés (par opposition aux transferts octet par octet transitant par le processeur).
Les adresses d’entrées/sorties (I/O ports) sont utilisées pour que le CPU puisse communiquer avec les périphériques en lecture/écriture ou écriture. Les adresses d’entrées/sorties sont souvent de 0x100 à 0x3ff.
Les paragraphes suivants décrivent les systèmes de fichiers /proc et /sys qui permettent d’avoir des informations sur les périphériques du système telles que les ressources allouées et les pilotes utilisés.
/proc réside dans la mémoire système. Il n’a pas d’existence sur les disques. Il contient des fichiers qui fournissent des informations importantes sur l’état du système telles que les informations relatives aux processus, aux paramètres du noyau et aux périphériques.
Le noyau conserve les informations relatives aux ressources allouées, à savoir les interruptions reçues, la liste des canaux DMA et les entrées- sorties en cours d’utilisation, respectivement dans les fichiers suivants :
philippe@guidella:~$ more /proc/interrupts CPU0 CPU1 0: 49 1566 IO-APIC-edge timer 1: 53150 26 IO-APIC-edge i8042 3: 0 3 IO-APIC-edge 4: 0 3 IO-APIC-edge 7: 2 0 IO-APIC-edge parport0 8: 0 1 IO-APIC-edge rtc0 9: 0 0 IO-APIC-fasteoi acpi 12: 2306820 134 IO-APIC-edge i8042 14: 7447 795947 IO-APIC-edge pata_amd 15: 0 0 IO-APIC-edge pata_amd 16: 13975537 200 IO-APIC-fasteoi hda_intel, nvidia 17: 0 0 IO-APIC-fasteoi eth1 19: 4181 43 IO-APIC-fasteoi firewire_ohci 20: 1 335 IO-APIC-fasteoi hda_intel 21: 4843045 6687 IO-APIC-fasteoi sata_nv 22: 20025081 1234 IO-APIC-fasteoi ehci_hcd:usb1 23: 186 10569307 IO-APIC-fasteoi ohci_hcd:usb2 43: 3439597 21 PCI-MSI-edge sky2@pci:0000:03:00.0 NMI: 0 0 Non-maskable interrupts LOC: 178538141 197321839 Local timer interrupts
philippe@guidella:~$ more /proc/dma 4: cascade philippe@guidella:~$
philippe@guidella:~$ more /proc/ioports 0000-ffff : PCI Bus #00 0000-001f : dma1 0020-0021 : pic1 0040-0043 : timer0 0050-0053 : timer1 0060-0060 : keyboard 0064-0064 : keyboard 0070-0073 : rtc0 0080-008f : dma page reg 00a0-00a1 : pic2 00c0-00df : dma2 00f0-00ff : fpu 0170-0177 : 0000:00:06.0 0170-0177 : pata_amd 01f0-01f7 : 0000:00:06.0 01f0-01f7 : pata_amd 0290-0297 : pnp 00:02 02f8-02ff : serial 0376-0376 : 0000:00:06.0 0376-0376 : pata_amd 0378-037a : parport0 03c0-03df : vesafb 03f6-03f6 : 0000:00:06.0 03f6-03f6 : pata_amd 03f8-03ff : serial 04d0-04d1 : pnp 00:02 0800-087f : pnp 00:02 0970-0977 : 0000:00:08.0 0970-0977 : sata_nv 09f0-09f7 : 0000:00:08.0 09f0-09f7 : sata_nv --More--(0%)
Avec le noyau 2.6, la plupart des informations relatives aux périphériques ont été déplacées vers /sys.
Sysfs permet de connaître des informations sur les périphériques du système et leurs pilotes, il est également utilisé pour configurer certaines fonctionnalités du noyau.Sysfs est monté sur /sys et vous pouvez le parcourir.
/sys est organisé en un ensemble de répertoires, chacun contient un certain nombre de fichiers qui contiennent en général une seule valeur. Certains liens symboliques sont présents, parcourant plusieurs branches de l’arborescence du /sys.
peuplé de liens symboliques, représentant la manière dont chaque périphérique appartient aux différents bus
montre les périphériques regroupés en classes, comme les périphériques réseau par exemple
contient les périphériques de type bloc
Le démon udevd écoute les messages du noyau concernant les changements d’état du périphérique.
udevd utilise ces informations, ainsi que les informations sur le périphérique fournies par le noyau au travers du système de fichiers /sys, pour effectuer les opérations de chargement des modules de pilotes de périphériques, de chargement des firmwares et de création des fichiers spéciaux de périphériques dans le répertoire /dev.
D-Bus, système de communication inter-processus, utilise sysfs pour la diffusion d’événements système tels que « nouveau matériel ajouté » ou « file d’attente changée ».
Le démon hald est connecté à D-Bus afin d’offrir une API que les applications peuvent utiliser pour découvrir, surveiller et invoquer des opérations sur les périphériques. Cette API constitue une couche d’abstraction matérielle (Hardware Abstraction Layer ou HAL).
Les cartes d’extension branchées sur les bus AGP ou PCI sont détectées par le système d’exploitation au démarrage. Les ressources qui leur sont allouées dépendent des spécifications des bus sur lesquels elles sont connectées et les conflits de ressources sont donc gérés quasi automatiquement. Ces ressources ainsi que d’autres informations sur ces périphériques peuvent être visualisées dans les systèmes de fichiers /proc et /sys, ou bien en utilisant les commandes dmesg et lspci.
La liste des ressources allouées par le système d’exploitation au démarrage est conservée dans le fichier /var/log/dmesg. La commande dmesg affiche le contenu de ce fichier, où sont stockés les messages du noyau. Elle permet donc également d’afficher les ressources allouées par le noyau.
en examinant le contenu du fichier /proc/bus/pci, affiche un résumé synthétique des bus et cartes d’extension PCI détectés au démarrage par le système. On utilise en particulier les deux options –v, qui affiche les ressources allouées par le système à ces cartes (IRQ et adresse d’entrée/sortie), et -b qui affiche les ressources allouées par le BIOS.
Dans l’exemple suivant, nous allons examiner les caractéristiques de la carte réseau attachée à notre machine.
philippe@guidella:~$ lspci | grep -i ethernet 01:06.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10) 03:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8056 PCI-E Gigabit Ethernet Controller (rev 12) philippe@guidella:~$
La sortie de cette commande donne l’identifiant du périphérique PCI. On peut avoir plus d’informations sur ce périphérique, tels que le pilote associé et les ressources allouées.
philippe@guidella:~$ lspci -v -s 03:00.0 03:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8056 PCI-E Gigabit Ethernet Controller (rev 12) Subsystem: Elitegroup Computer Systems Device 8056 Flags: bus master, fast devsel, latency 0, IRQ 43 Memory at fddfc000 (64-bit, non-prefetchable) [size=16K] I/O ports at ac00 [size=256] [virtual] Expansion ROM at fdc00000 [disabled] [size=128K] Capabilities: <access denied> Kernel driver in use: sky2 Kernel modules: sky2 philippe@guidella:~$
udevadm info est probablement l'outil le plus puissant pour aider dans la construction des règles. Tout ce que vous devez connaître est la dénomination sysfs du périphérique en question.
philippe@guidella:~$ udevadm info -p /sys/class/net/eth0 -a Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/pci0000:00/0000:00:0b.0/0000:03:00.0/net/eth0': KERNEL=="eth0" SUBSYSTEM=="net" DRIVER=="" ATTR{addr_assign_type}=="0" ATTR{addr_len}=="6" ATTR{dev_id}=="0x0" ATTR{ifalias}=="" ATTR{iflink}=="2" ATTR{ifindex}=="2" ATTR{features}=="0x700149a3" ATTR{type}=="1" ATTR{link_mode}=="0" ATTR{address}=="00:19:21:4b:1a:a7" ATTR{broadcast}=="ff:ff:ff:ff:ff:ff" ATTR{carrier}=="1" ATTR{speed}=="100" ATTR{duplex}=="full" ATTR{dormant}=="0" ATTR{operstate}=="up" ATTR{mtu}=="1500" ATTR{flags}=="0x1003" ATTR{tx_queue_len}=="1000" ATTR{netdev_group}=="0" looking at parent device '/devices/pci0000:00/0000:00:0b.0/0000:03:00.0': KERNELS=="0000:03:00.0" SUBSYSTEMS=="pci" DRIVERS=="sky2" ATTRS{vendor}=="0x11ab" ATTRS{device}=="0x4364" ATTRS{subsystem_vendor}=="0x1019" ATTRS{subsystem_device}=="0x8056" ATTRS{class}=="0x020000" ATTRS{irq}=="43" ATTRS{local_cpus}=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000003" ATTRS{local_cpulist}=="0-1" ATTRS{numa_node}=="0" ATTRS{dma_mask_bits}=="64" ATTRS{consistent_dma_mask_bits}=="64" ATTRS{broken_parity_status}=="0" ATTRS{msi_bus}=="" looking at parent device '/devices/pci0000:00/0000:00:0b.0': KERNELS=="0000:00:0b.0" SUBSYSTEMS=="pci" DRIVERS=="pcieport" ATTRS{vendor}=="0x10de" ATTRS{device}=="0x03e9" ATTRS{subsystem_vendor}=="0x10de" ATTRS{subsystem_device}=="0x0000" ATTRS{class}=="0x060400" ATTRS{irq}=="41" ATTRS{local_cpus}=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000003" ATTRS{local_cpulist}=="0-1" ATTRS{numa_node}=="0" ATTRS{dma_mask_bits}=="32" ATTRS{consistent_dma_mask_bits}=="32" ATTRS{broken_parity_status}=="0" ATTRS{msi_bus}=="1" looking at parent device '/devices/pci0000:00': KERNELS=="pci0000:00" SUBSYSTEMS=="" DRIVERS=="" philippe@guidella:~$
philippe@guidella:~$ udevadm info -a -p /sys/block/sda Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/pci0000:00/0000:00:08.0/host2/target2:0:0/2:0:0:0/block/sda': KERNEL=="sda" SUBSYSTEM=="block" DRIVER=="" ATTR{range}=="16" ATTR{ext_range}=="256" ATTR{removable}=="0" ATTR{ro}=="0" ATTR{size}=="488397168" ATTR{alignment_offset}=="0" ATTR{discard_alignment}=="0" ATTR{capability}=="50" ATTR{stat}==" 2974275 717873 150012286 12713568 591937 838782 20145345 23755576 0 7705380 36464080" ATTR{inflight}==" 0 0" ATTR{events}=="" ATTR{events_async}=="" ATTR{events_poll_msecs}=="-1" looking at parent device '/devices/pci0000:00/0000:00:08.0/host2/target2:0:0/2:0:0:0': KERNELS=="2:0:0:0" SUBSYSTEMS=="scsi" DRIVERS=="sd" ATTRS{device_blocked}=="0" ATTRS{type}=="0" ATTRS{scsi_level}=="6" ATTRS{vendor}=="ATA " ATTRS{model}=="ST3250820AS " ATTRS{rev}=="3.AA" ATTRS{state}=="running" ATTRS{timeout}=="30" ATTRS{iocounterbits}=="32" ATTRS{iorequest_cnt}=="0x38b01e" ATTRS{iodone_cnt}=="0x38b01d" ATTRS{ioerr_cnt}=="0x32a" ATTRS{evt_media_change}=="0" ATTRS{dh_state}=="detached" ATTRS{queue_depth}=="1" ATTRS{queue_type}=="none" looking at parent device '/devices/pci0000:00/0000:00:08.0/host2/target2:0:0': KERNELS=="target2:0:0" SUBSYSTEMS=="scsi" DRIVERS=="" looking at parent device '/devices/pci0000:00/0000:00:08.0/host2': KERNELS=="host2" SUBSYSTEMS=="scsi" DRIVERS=="" looking at parent device '/devices/pci0000:00/0000:00:08.0': KERNELS=="0000:00:08.0" SUBSYSTEMS=="pci" DRIVERS=="sata_nv" ATTRS{vendor}=="0x10de" ATTRS{device}=="0x03f6" ATTRS{subsystem_vendor}=="0x1019" ATTRS{subsystem_device}=="0x2601" ATTRS{class}=="0x010185" ATTRS{irq}=="21" ATTRS{local_cpus}=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000003" ATTRS{local_cpulist}=="0-1" ATTRS{numa_node}=="0" ATTRS{dma_mask_bits}=="32" ATTRS{consistent_dma_mask_bits}=="32" ATTRS{broken_parity_status}=="0" ATTRS{msi_bus}=="" looking at parent device '/devices/pci0000:00': KERNELS=="pci0000:00" SUBSYSTEMS=="" DRIVERS=="" philippe@guidella:~$
udevadm info renvoie une liste d'informations que vous pouvez utiliser dans vos règles udev. Avec l'exemple précédant on peut créer deux règles pour ce périphérique :
En effet
L’USB (Universal Serial Bus) est une interface qui permet de relier des périphériques à un PC. Elle possède les caractéristiques suivantes :
Les types de périphériques pouvant être connectés sont les suivants :
Les contrôleurs USB sont intégrés à la carte mère. Ils peuvent être compatibles avec les types suivants :
Les modules du noyau correspondant à chaque type de contrôleur sont respectivement usb-ohci.o, usb-uhci.o et ehci-hdc.o, mais pour qu’un périphérique fonctionne correctement, il faudrait charger, en plus du pilote du contrôleur USB utilisé, le pilote de ce périphérique.
fournit des informations sur les périphériques USB reliés à la machine.
philippe@guidella:~$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 002: ID 04b4:6830 Cypress Semiconductor Corp. CY7C68300A EZ-USB AT2 USB 2.0 to ATA/ATAPI Bus 001 Device 003: ID 06f8:300d Guillemot Corp. Bus 002 Device 007: ID 0502:3203 Acer, Inc. Liquid (Debug mode) Bus 002 Device 003: ID 058f:9360 Alcor Micro Corp. 8-in-1 Media Card Reader Bus 001 Device 018: ID 04e8:330c Samsung Electronics Co., Ltd philippe@guidella:~$
philippe@guidella:~$ sudo dmesg | tail [271491.012027] usb 1-5: device not accepting address 25, error -71 [271491.124037] usb 1-5: new high speed USB device number 26 using ehci_hcd [271491.532062] usb 1-5: device not accepting address 26, error -71 [271491.532106] hub 1-0:1.0: unable to enumerate USB device on port 5 [271491.976058] usb 2-5: new full speed USB device number 7 using ohci_hcd [271492.177079] usb 2-5: not running at top speed; connect to a high speed hub [271492.200055] scsi10 : usb-storage 2-5:1.3 [271493.221144] scsi 10:0:0:0: Direct-Access ACER Mass Storage 0000 PQ: 0 ANSI: 2 [271493.368565] sd 10:0:0:0: Attached scsi generic sg4 type 0 [271493.394125] sd 10:0:0:0: [sdd] Attached SCSI removable disk