This is an old revision of the document!
Responsabili: Darius Neațu, Radu Vișan
Deadline: 20.12.2015, ora 23:55
Ultima modificare: 7.12.2015
Publicare teste: 22.12.2015
În urma realizării acestei teme, studentul va fi capabil să:
Primul sector fizic de pe un hard-disk poartă numele de Master Boot Record (MBR). Acest sector are 512 octeți și conține informații foarte importante despre modul cum este partiționat hard-disk-ul. Dacă acest sector este suprascris sau șters toate informațiile de pe hard-disk se șterg.
În cadrul MBR se găsesc informații despre fiecare partiție de pe hard-disk. Aceste informații sunt stocate într-o tabelă de partiții primare care are doar patru intrări. Prin urmare MBR-ul poate reține informații doar pentru 4 partiții primare. Una dintre aceste patru partiții primare va fi marcată ca activă și de pe ea se va încerca pornirea sistemului de operare. MBR-ul mai contine și bootloader-ul – un mic program care pornește un sistem de operare prezent pe computer. În figura următoare se poate vedea configurația unui MBR:
Pentru mai multe informații puteți consulta Wikipedia.
Mbrel, student la Facultatea de Automatică și Calculatoare, seria CA, s-a mutat recent în Codeland. După ce a implementat un alocator de memorie, s-a dus să i-l arate lui Algorel, prietenul său. Algorel nu a fost impresionat și a venit cu o nouă provocare pentru el: să îi repare tabela de partiții de pe laptop. Mbrel consideră că tema este prea ușoara pentru el și pentru că lucrează la un nou sistem de operare, după ce a rescris kernelul Linux, așa că s-a gândit să vă propună această temă spre rezolvare. Pe lângă nota 10 și mulțumiri, Mbrel vă oferă, în cazul unei reușite, un pupic sau o strângere de mână (după preferințe).
În implementarea temei vom considera un model simplificat al MBR, întrucat unele informații nu sunt relevante pentru noi în acest moment. Vom simula un sistem de fișiere de pe un hard-disk, considerat un fișier binar din motive de simplitate. Partițiile existente sunt toate primare, iar numărul lor poate fi mai mare decât patru.
Definim următoarele elemente:
Observații
Pentru a ilustra cele spuse anterior vom considera exemplul din Figura 1:
In figură am folosit următoarele convenții:
În exemplu, MBR conține două partiții: prima începe la poziția 0x0C în fișier, iar cea de-a doua partiție începe la poziția 0x44 (0x semnifică baza 16; 44 în baza 16 înseamnă 68 în baza 10).
Prima partiție are numele “/dev/sda”, MAXD = 1, MAXF = 1 și conține:
Analog se definește și a doua partiție.
Validare MBR - 30 puncte
Dându-se un fișier de intrare cu o astfel de configurație se cere să se verifice corectitudinea valorilor din MBR. Un MBR este valid dacă adresele partițiilor menționate sunt corecte în cadrul fișierului. Dacă configurația este validă, atunci se vor afișa la stdout:
În cazul în care nu este validă configurația se va afișa doar mesajul “INVALID”.
Exemple:
Pentru exemplul din Figura 1 se va afișa următorul output:
SUCCES /dev/sda 36 36 /dev/sdb 60 12
Explicație:
Prima parție are un total_space (egal cu occupied_space) de 36 bytes deoarece conține:
A doua partiție contine doar un fișier, deci occupied_size este 12 bytes. Partiția mai are alocat spațiu pentru încă un fișier inexistent (12 bytes) , precum și pentru un director cu 2 fișiere în el (12 + 2*12 = 36 bytes).
Exemple de fișiere invalide se regăsesc în Figura 2.
Operații cu sistemul de fișiere - 30 de puncte
Se va da un set de operații care trebuie să fie aplicat asupra sistemului de fișiere. Se cere implementarea următoarelor operații:
Se va crea fișierul specificat prin calea absolută <path>. Întrucât un director are alocat un număr fix de sloturi pentru fișiere, unele fiind goale (pline de 0), se va folosi primul slot liber din directorul respectiv pentru a aloca noul fișier.
Se va redenumi fișierul specificat prin calea absolută <path>.
Se va șterge fișierul specificat prin calea absolută <path>.
Se va crea directorul specificat prin calea absolută <path>. Întrucât o partiție are alocat un număr fix de sloturi pentru directoare, unele fiind goale (pline de 0), se va folosi primul slot liber din partiția respectivă pentru a aloca noul director.
Se va redenumi directorul specificat prin calea absolută <path>.
Se va șterge directorul specificat prin calea absolută <path>.
Se va afișa lista de fișiere conținute in directorul de la calea absolută <path>. Se va afișa câte un element pe linie. În caz de succes această operație nu va mai afișa mesajul “SUCCES”, ci doar lista de fișiere.
O operație executată cu succes va afișa la stdout mesajul “SUCCES”, iar o operație care nu se poate executa va afișa mesajul “INVALID”.
Operații cu partiții – 30 puncte
Într-un sistem real partițiile sunt dinamice, în sensul că pot suferi modificări. Pentru a simula aceste functionalități se cere implementarea următoarelor operații:
Se va șterge partiția dată prin nume. Atenție! Ștergerea presupune doar eliminarea partitiei din MBR.
Se parcurge hard-disk-ul în cautarea unei porțiuni de memorie continua liberă și suficient de mare pentru alocarea unui partiții. Dacă operația reușeșeste (se creează partiția cu caracteristicile date), atunci aceasta va afișa doar adresa de început a partiției create.
Se initializează cu 0 toată zona de memorie corespunzătoare directoarelor și fișierelor de pe partiție.
O operație executată cu succes va afișa la stdout mesajul “SUCCES”, iar o operație care nu se poate executa va afișa mesajul “INVALID”.
Restore MBR – 20 puncte
Există situații în care valorile din MBR pot fi alterate. Dorim să refacem MBR cu toate parțiile valide. Se cunoaște doar lista de partiții (numele lor) și configurația hardk-disk-ului, se cere afișarea MBR-ului corect. Un exemplu se regăsește în Figura 3.
Output-ul corespunzător este următorul:
MBR_SIZE: 2 PARTITIONS_OFFSET: 12 68
Arhiva de testare se gaseste aici.