-
Faire l’interface entre:
- les demandeurs (applications dites utilisateur) en ressources (espace memoire, fichiers, connexions reseaux, ...)
- les ressources disponibles : processeurs, memoire, disques, carte reseau, ...
-
Gerer les offres et les demandes dans leur ensemble, pour arbitrer leur attribution:
- dans l’espace (allocation)
- dans le temps (ordonnancement)
- Un
processeur
pour les calculs. - La
mémoire
pour initialiser et sauvegarder les résultats. - Les
périphériques
d'entrée pour charger les données. - Les
périphériques
de sortie pour restituer les résultats.
Ces entités sont reliées les unes aux autres par des bus.
- fréquence de fonctionnement (GHz, MHz)
- instructions par seconde (MIPS)
- tailles des données traitiées (bits)
Familles: interprête un même language machine (ex: x86, ARM, Xscale)
Emulateur: traduit à la volée des instructions d'une famille a l'autre
-
Unité de commande:
Orchestre les instructions à executer (métronome dans l'archi de Von Neumann).
Formé de plusieurs registres (ex: compteur ordinal, mémorise l'adresse des instructions)
-
Unité de traitement:
Réalise le calcul.
Deux types de registres: Etat (ex: retenue lors de l'addition) / Generaux (accumulateur, données)
Fréquence fixe (en Hz): cycles par seconde
Cadence l'ensemble des périphériques, pour qu'ils soient synchronisés.
=> envoi des messages, on sais si le bus est occupé ou pas
=> dans la réalité, c'est le processeur qui demande d'écrire ou de lire des données
Peut contenir:
- un entier
- un flottant
- une adresse
Références:
eax
,ebx
,ecx
,edx
: géneraux (32bits, entiers et adresses)eip
: pointeur courant (instruction actuelle)esp
: pile, variables locales aux fonctions
Liaison physique d'un matériel vers un autre.
x
fils => bus de largeur x
(ex: 16 bits => 16 fils)
-
bus d'adressage => fournis l'adresse (dans la carte mémoire, réseau etc)
-
bus de contrôle => fournis la commande a executer (ex: lecture/ecriture)
-
bus de données => fournis la donner a faire transitionner (valeur)
Bus de controle et données: bi-directionnels, attendent une réponse
Bus mémoire: processeur <-> RAM (mov) Bus I/O: autres périphériques (bus PCI, AGP, ISA, IDE...)
Sur PC, les deux sont confondus, mais pas la mê vitesse/largeur de données.
=> chipsets:
assurent l'interconnexion bus <-> processeur
Donc sur PC, quand on accède a une adresse par le "bus mémoire", on tombe sur:
- de la mémoire physique, ou le bios => adresses basses
- un périphérique matériel (récent) => projeté, mappé en mémoire physique
- rien du tout
Un bus travers la carte mère, et est partagé entre les différents périphériques (ex: RAM <-> NET <-> CPU)
Accès aux vieux périphériques (standard PC, contrôleurs d'interruptions, bus ISA, ...)
Deux familles d'instructions:
- entrée:
inb
(8bits),inw
(16bits),inl
(32bits) - sortie:
outb
(8bits),outw
(16bits),outl
(32bits)
Etat (0/1), quasiment toujours identique sauf quand un évenement remarquable se produit (touche clavier, paquet réseau...)
Quand le processeur detecte un changement d'état, il interrompt le programme associé a l'interuption et fait un saut vers une routine (petit programme) pour faire un traitement, avant de retourner dans le flot d'instructions interrompus.
=> performance, evite de faire du polling (attente active).
- PC originel: 16 lignes d'interruptions sur 2 contolleurs (PIC, Programmable Interrupt Controller) en cascade (donc 15 utilisables).
- PC modernes: le processeur joue le role des controlleurs (256 lignes)
Stockage des données, chaque "tiroir" a une adresse permettant de le localiser.
n bits par adresse => 2^n adresses/tiroirs
- Statique (SRAM)
- DRAM FPM (1987)
- DRAM EDO (1995)
- SD-DRAM (1997)
- DDR SD-RAM (2000)
- Dynamique (DRAM).
- Flash EPROM (ou le BIOS est stoqué)
=> permanente, facile d'accès en lecture mais pas en écriture.
Assure la connexion et la communication entre les composants.
Support pour le processeur (socket), horloge pour cadencer les bus...
Résolution:
- 80x25 /43x25 en alphanumérique (ASCII)
Cartes Hercules (HGC)
Micro-controleur qui lis de facon pérpétuelle dans la barette de RAM pour mettre à jour l'affichage comme le balayage du canon à électron pour les écrans cathodiques.
2 octets pour un char (matrice de res 2 x 80 x 25, en mémoire sous forme linéaire)
1 octet (8bits):
- couleur char (3bits)
- couleur fond (3bits)
- clignotement (2bits)
Résolution:
- 640x480 en 16 couleurs
- 320x200 en 256 couleurs
ou
Mode hercule (voir plus haut)
Affichage d'images
Firmware => programme intégré dans le materiel. Peut être mis a jour (ex: faille de sécurité).
Driver => programme sur l'OS faisant la traduction entre le Spécifique à chaque périphérique et pour chaque constructeur. Compose 70% d'un OS. Chargé dans l'espace mémoire, dispose de tous les privilèges. => Risque: si le driver a un problème, l'OS s'arrête (Linux, 7x plus de bugs drivers que kernel).
Traduction directe d'un language machine (binaire) a un language humain (opcodes)
- INTEL : instruction destination, source
- AT&T : instruction source, destination
Les instructions de base: mnémoniques
Une ligne de mnémoniques => opcode
architecture
-
CISC
(actuelle): les opcodes ont des tailles variables, ex:MOV adr1 adr2 => MOV (8 bits) + 2 PARAMS (2x16bits) HALT => HALT (8bits)
-
RISC
(ancienne): tous les opcodes on la même taille si un param n'est pas utilisé, il est remplacé par nul
- registre : référence au contenu d’un registre.
- mémoire : référence aux données situés à l’adresse définie par l’opérande.
- immédiate : une opérande à valeur fixe.
- implicite : opérande est associé à l’instruction.
- MOV source, destination
- ADD operande*(reg/mem/imm), operande*(reg/mem/imm)
- SUB operande*(reg/mem/imm), operande*(reg/mem/imm)
- INC operande_(reg/mem/imm)
- DEC operande_(reg/mem/imm)
- CMP operande1*(reg/mem/imm), operande2*(reg/mem/imm)
registre FLAGS: drapeaux zéro (ZF) et retenue (CF)
- GOTO: a éviter (remplace le nom de l'adresse par l'instruction) peu efficace
- JMP: sauts longs => espace code et rapidité intègre des conditionelles avec les FLAGS JZ => (ZF / CF) et JC (CF / ZF)
- LOOP: décrémente ECX tq > 0
- CALL: appel de procédure
-
Fichiers code (.c)
Etape de précompilation (remplacement des macros)
-
Fichiers précompilés (.c)
Compilation en binaire
-
Fichiers binaires (.o)
Linkage des variables entre les plusieurs fichiers + point d'entrée
-
Fichier binaire (.exe)
C'est ensuite le BIOS qui prends la main => BIOS mort, plus de pc
exemple d'erreur "BOOT disc not found"
- référence en dur vers les disques, première instructions (ex: Noyau à l'adresse 0x00000)
- possible de modifier les instructions (ex: lecture ecriture barettes mémoires pour vérifier si il y a des cellules qui ne sont plus opérationelles)
Choix du système a démarrer (dual boot...) + évolué qu'un bios (ex: peut booter sur le réseau => OS pas sur le disque dur mais en réseau sur un serveur)
- Attente active: demande en boucle tant que pas de réponse
- Attente passive: attente d'une réponse
- processeur / Exception: evenement critique (ex: division par 0)
- logicielle: instruction INT ou INT8 (ex: breakpoint dans le code)
- materielle: courant electrique envoyé au CPU (ex: appui a une touche du clavier)
code d'interuption: Handler (ou Routine)
Contrôleurs d'interruption et les IRQ Bus 16 bits, 15 interuptions possible. Cascade au numéro 2
Priorité: 0 > 1 > 8 - 15 > 3 - 7
Entrée IDT: origine
Activité / Thread: registre du processeur, dont une pile (tas) de données et une zone de code
Permet de stoquer les données utilisateur
3 fonctions:
- Initialiser du pointeur (new)
- Récupération de la taille pour stoquer n octets (getmem)
- Ecraser la mémoire pas des zéros (greemem)
Situé physiquement au début de la barette de RAM.
Flot d'execution (donction qui appelle une autre fonction etc) Gestion des variables locales
=> Last In First Out
Allocation et désallocation de mémoire automatique => Reservation et libération faite par le compilateur
Stoquage de la frame de données dans la pile
- Base pointer EBP: début de frame
- Stack pointer ESP: fin de frame
- Frame pointer EIP: adresse de retour
- Allocation d'une taille BUFSIZE a une variable
- Entrée de données d'une taille supérieure a BUFSIZE dans la var
- Dépassement sur les variables successives
- Lors de l'appel des variables successives, c'est le code malicieux qui sera appelé
- Pour que le code soit immédiatement executé, on peut écrire son adresse dans le retour
Système multitache:threadsinterrompus (eux mêmes, ou ordonnanceur)
Problème: programme imprévisibles (accès a une même ressource dans les deux threads, mais pas de possibilité de connaitre l'ordre)
Ressource critique: donnée limitée en accès.
Section critique: instructions accédans a une ressource critique.
Section atomique: jamais interrompu, tout le temp executé dans son intégrité (ex: attribution a une var)
- Primitive: instruction atomique, permet synchronisation (ex: Promise.all)
Empecher les autres threads d'accéder a la ressource
Deux opérations: lock / unlock
Pouvoir controller finement le nb de process qui peuven taccéder.
Sac de clés pour accéder a la ressource, mais nombre de clé limité
Trois opérations: init / down / up
1 seul jeton, sémaphore binaire.
protéger une ressource partagée en mode multiprocesseur.
Lock une ressource, les autres demandes sont en attente de la fin du premier traitement. => attente active, appels succéssifs jusqu'a réponse positive (cycles cpu gachés) => attente passive (mis en WAIT state), et on le préviens quand c'est fini (mais chgmt d'état, + lent)
Suppose que les zones critiques ont une durrée d'execution courte (ex: ecriture).
Utilisé avec parcimonie, que dans les kernels.
xchf => atomique, permet de swap des variables (etat précédent avec courant)
Deux threads qui veulent partager deux ressources simultanément
Chaque thread a une ressource mais a besoin de l'autre pour continuer. => Les deux sont donc en attente de l'autre.
Plusieurs lecteurs, un écrivain. Perpetuellement des lecteurs mais l'écrivain ne peut écrire que si personne ne lis.
L'écriveur est donc bloqué.
Avant lancement du programme => déclaratio, de la taille de mémoire a allouer pour chaque type
Allocation de mémoire contigue pour chaque var si possible. Si déja des emplacements utilisés par des variables, fractionnement sur les espaces succésivements disponibles.
=> Mémoire virtuelle (MMU) map de mémoire physique en virtuel (abstraction en pages). Peut être ajusté pendant l'execution. Affranchissement de la segmentation pour utiliser toute la RAM dispo. Permet également de stoquer des données en RAM (swop).
Pages (virtuel) et Cadres (physique)
https://en.wikipedia.org/wiki/Page_table
Defaut de page (exceptions levées par le MMU)