Préparation certification LPIC-1 Architecture et périphérique


Table des matières

Référence
Architecture de base de l’ordinateur
Objectifs
Points importants
Mots clés
Le processeur (Central Processing Unit ou CPU)
Mémoires
Le BIOS (Basic Input/Output System)
Les bus
Les disques
Introduction à la gestion des périphériques
Objectifs
Points importants
Mots clés
Les bus
Allocation de ressources
Le pseudo système de fichiers /proc
Le pseudo système de fichiers /sys ou sysfs
Les cartes PCI
USB
Exercices

Référence

Architecture de base de l’ordinateur

Objectifs

Se familiariser avec les notions de base de l’architecture matérielle des ordinateurs.

Points importants

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.

Mots clés

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 (Central Processing Unit ou CPU)

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.

Mémoires

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 (Basic Input/Output System)

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.

Les bus

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

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.

Introduction à la gestion des périphériques

Objectifs

Points importants

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.

Mots clés

ISA, PCI, AGP, IRQ, DMA (canaux), /proc, /sys, lspci, lsusb, udev

Les bus

Un PC utilise généralement plusieurs types de bus :

Allocation de ressources

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.

Le pseudo système de fichiers /proc

/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%)

Le pseudo système de fichiers /sys ou sysfs

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.

/sys/bus

peuplé de liens symboliques, représentant la manière dont chaque périphérique appartient aux différents bus

/sys/class

montre les périphériques regroupés en classes, comme les périphériques réseau par exemple

/sys/block

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 PCI

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.

La commande lspci

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

La commande udevadm info

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

Pour le périphérique sda

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

USB

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.

La commande lsusb

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

Exercices