Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare:teme_2015:tema4_2015_ca [2015/12/07 00:53]
radu_silviu.visan created
programare:teme_2015:tema4_2015_ca [2015/12/22 22:15] (current)
darius.neatu
Line 3: Line 3:
 **Responsabili**:​ Darius Neațu, Radu Vișan **Responsabili**:​ Darius Neațu, Radu Vișan
  
-**Deadline**: ​TODO+**Deadline**: ​20.12.2015, ora 23:55
  
-**Ultima modificare**: ​7.12.2015+**Ultima modificare**: ​22.12.2015
  
 +**Publicare checker**: 22.12.2015
  
  
Line 23: Line 24:
 ----- -----
  
-Primul sector fizic de pe un hard-disk poartă numele de Master Boot Record (MBR). Acest sectore ​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.+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. Î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. 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:+În figura următoare se poate vedea configurația unui MBR:  
 + 
 + 
 +{{ :​programare:​teme_2015:​mbr.jpg?​400x300 }}
  
-TODO 
  
 Pentru mai multe informații puteți consulta Wikipedia. Pentru mai multe informații puteți consulta Wikipedia.
Line 49: Line 52:
     - o listă cu adresele de început pentru fiecare partiție existentă. În  continuare ne vom referi la o adresă ca fiind o poziție din fișierul binar pe care se lucrează. Prima poziție din fișier este 0x00.     - o listă cu adresele de început pentru fiecare partiție existentă. În  continuare ne vom referi la o adresă ca fiind o poziție din fișierul binar pe care se lucrează. Prima poziție din fișier este 0x00.
   - Partiție \\ O partiție înglobează un sistem de fișiere și directoare, având o dimensiune specificată. \\ Conține în ordine următoarele informații:​   - Partiție \\ O partiție înglobează un sistem de fișiere și directoare, având o dimensiune specificată. \\ Conține în ordine următoarele informații:​
-    - header =  o succesiune de 12 bytes cu următoarea semnificație:​+    - header =  o succesiune de 20 bytes cu următoarea semnificație:​
       - un int reprezentând lungimea numelui partiției       - un int reprezentând lungimea numelui partiției
       - 8 bytes reprezentând numele partiției; prin convenție, numele partiției este de          forma “/​dev/​sd?​”,​ unde ? este un character alfanumeric       - 8 bytes reprezentând numele partiției; prin convenție, numele partiției este de          forma “/​dev/​sd?​”,​ unde ? este un character alfanumeric
Line 70: Line 73:
  
 Pentru a ilustra cele spuse anterior vom considera exemplul din Figura 1: Pentru a ilustra cele spuse anterior vom considera exemplul din Figura 1:
-TODO+ 
 +{{ :​programare:​teme_2015:​dump-example.png?​nolink&​300 |}}
  
 In figură am folosit următoarele convenții: In figură am folosit următoarele convenții:
Line 77: Line 81:
   * Descrierea unui director ​ = albastru   * Descrierea unui director ​ = albastru
   * Descrierea unui fișier = mov   * Descrierea unui fișier = mov
-  * Indexul de start al liniilor, ​respective ​indicii coloanelor = negru (acesta este doar pentru exemple, fișierele de intrare nu vor conține aceste valori)+  * Indexul de start al liniilor, ​respectiv ​indicii coloanelor = negru (acesta este doar pentru exemple, fișierele de intrare nu vor conține aceste valori)
  
-Î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 inseamnă 68 în baza 10).+Î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: Prima partiție are numele ​ “/​dev/​sda”,​ MAXD = 1, MAXF = 1 și conține:
Line 88: Line 92:
  
  
-== Cerințe ===+=== Cerințe ===
 ----- -----
 +
 +
 +
 +== Task 1 ==
 +**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:
 +  * pe prima linie mesajul “SUCCES”
 +  * pe următoarele linii tabela de partiții. Fiecare linie are urmatorul format:
 +    * "​nume_partitie total_space used_space"​. Valorile numerice afișate se exprima în bytes.
 +    * total_space reprezintă numărul de bytes alocați pe partiție pentru fișiere și directoare (acest număr nu se modifică pentru o partiție dată)
 +    * used_space reprezintă numărul de bytes alocați pentru directoarele și fișierele existente
 +
 +Î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:
 +<​code>​
 +SUCCES
 +/dev/sda 36 36
 +/dev/sdb 60 12
 +</​code>​
 +
 +**Explicație**:​
 +
 +Prima parție are un total_space (egal cu occupied_space) de 36 bytes deoarece conține:
 +  * un fișier (care ocupă 12 bytes)
 +  * un director cu un fișier în el (care ocupă 12+12 bytes). ​
 +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).
 +
 +{{:​programare:​teme_2015:​task1-wrong1.png?​nolink&​300 |}} {{ :​programare:​teme_2015:​task1-wrong2.png?​nolink&​300 |}}
 +
 +
 +Exemple de fișiere invalide se regăsesc în Figura 2.
 +
 +
 +== Task 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:
 +  * CREATE_FILE <​path>​
 +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. ​
 +  * RENAME_FILE <​path>​ <​newName>​
 +Se va redenumi fișierul specificat prin calea absolută <​path>​.
 +  * DELETE_FILE <​path>​
 +Se va șterge fișierul specificat prin calea absolută <​path>​.
 +  * CREATE_DIR <​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.
 +  * RENAME_DIR <​path>​ <​newName>​
 +Se va redenumi directorul specificat prin calea absolută <​path>​.
 +  * DELETE_DIR <​path>​
 +Se va șterge directorul specificat prin calea absolută <​path>​.
 +  * PRINT <​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”.
 +
 +== Task 3 == 
 +**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:
 +  * DELETE_PARTITION <​name>​
 +Se va șterge partiția dată prin nume. Atenție! Ștergerea presupune doar eliminarea partitiei din MBR.
 +  * CREATE_PARTITION <​name> ​ <​MAXD> ​ <​MAXF>​
 +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. ​
 +  * FORMAT_PARTITION <​name>​
 +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”.
 +
 +== Task 4 - bonus ==
 +**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.  ​
 +
 +
 +{{ :​programare:​teme_2015:​bonus-example.png?​nolink&​300 |}}
 +
 +
 +Output-ul corespunzător este următorul:
 +<​code>​
 +MBR_SIZE: 2
 +PARTITIONS_OFFSET:​ 12 68
 +</​code>​
 +
 +
 +=== Alte precizări ===
 +------
 +  * Pariul făcut de cei doi prieteni implică și faptul că Mbrel s-a lăudat că poate face tema fără să citească în memorie tot fișierul, deci NU este permisă reținerea fișierului în memorie. Toate operațiile se vor face direct pe fișierul binar. Nerespectarea acestei restricții duce la ANULAREA punctajului pe temă.
 +  * Fișierele de input se vor numi //mbr.bin// (în care se va găsi hard-disk-ul),​ respectiv //mbr.op// (fișierul cu operații). ATENȚIE! Pentru task-urile 1 și 4  se va folosi doar fișierul //​mbr.bin//​.
 +  * Pentru evaluare programul vostru va primi ca parametru în linia de comandă indicele task-ului care urmeaza a fi evaluat pe testul respectiv (1, 2, 3 sau 4).
 +  * Tema se va implementa în limbajul C.
 +  * Fișierul de implementare a temei se va numi //mbr.c//.
 +  * Fișierele temei trebuie OBLIGATORIU împachetate într-o arhiva de tip //.zip//, cu numele //​Grupa_NumePrenume_Tema4.zip//​. Această arhivă va conține:
 +    * Codul sursă al programului vostru.
 +    * Un fişier //​Makefile//​ care să conţină regulile //build// şi //clean//. Regula //build// va compila programul într-un executabil cu numele //mbr//. Regula //clean// va şterge executabilul şi eventual toate binarele intermediare (fişiere obiect) generate de voi.
 +    * Un fişier //README// care să conţină explicații privitoare la modul de rezolvare.
 +  * Arhiva temei NU va conține fișiere binare.
 +  * Arhiva va fi trimisă atât pe vmchecker cât și pe moodle.
 +  * O temă care nu compilează nu va fi punctată.
 +  * O temă care compilează dar care NU trece nici un test pe vmchecker nu va fi punctată.
 +
 +
 +=== Notare ===
 +------
 +
 +  * 90 de puncte pentru task-urile 1-3 rulate pe vmchecker.
 +  * 10 puncte pentru README, coding style, comentarii în cod.
 +  * 20 de puncte pentru task-ul bonus. Punctajul pe task-ul bonus se acordă DOAR dacă tema a fost rezolvată integral.
 +
 +=== Testare ===
 +------
 +Arhiva de testare se gaseste [[http://​ocw.cs.pub.ro/​courses/​_media/​programare/​teme_2015/​mbr-checker.zip|aici]].
programare/teme_2015/tema4_2015_ca.1449442409.txt.gz · Last modified: 2015/12/07 00:53 by radu_silviu.visan
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0