Differences

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

Link to this comparison view

so2:laboratoare:lab11:exercitii [2018/05/08 08:21]
ionel.ghita
so2:laboratoare:lab11:exercitii [2019/05/08 09:53] (current)
constantin.ghioc [2. [3p] Mapare de memorie virtual contiguă în user space]
Line 100: Line 100:
       * Completați zonele marcate cu ''​TODO 1''​.       * Completați zonele marcate cu ''​TODO 1''​.
       * Parcurgeți secțiunea [[:​so2:​laboratoare:​lab11#​Kernel-space|Maparea memoriei. Kernel-space]].       * Parcurgeți secțiunea [[:​so2:​laboratoare:​lab11#​Kernel-space|Maparea memoriei. Kernel-space]].
-    * Alocați, în funcția de inițializare a modulului, o zonă de memorie de ''​NPAGES+1''​ pagini folosind ''​kmalloc''​.+    * Alocați, în funcția de inițializare a modulului, o zonă de memorie de ''​NPAGES+2''​ pagini folosind ''​kmalloc''​.
       * O pagină în kernel are dimensiunea [[http://​elixir.free-electrons.com/​linux/​v4.9/​source/​arch/​x86/​include/​asm/​page_types.h#​L9|PAGE_SIZE]].       * O pagină în kernel are dimensiunea [[http://​elixir.free-electrons.com/​linux/​v4.9/​source/​arch/​x86/​include/​asm/​page_types.h#​L9|PAGE_SIZE]].
        * Zona alocată din spațiul kernel este indicată de ''​kmalloc_area''​.        * Zona alocată din spațiul kernel este indicată de ''​kmalloc_area''​.
-       * Dimensiunea ''​NPAGES+1''​ este necesară pentru aliniere.+       * Dimensiunea ''​NPAGES+2''​ este necesară pentru aliniere.
     * Adresa ​ ''​kmalloc_ptr''​ (variabilă globală) obținută în urma apelului ''​kmalloc''​ trebuie aliniată la adresa unei pagini.     * Adresa ​ ''​kmalloc_ptr''​ (variabilă globală) obținută în urma apelului ''​kmalloc''​ trebuie aliniată la adresa unei pagini.
       * Pentru aceasta, va trebui să alocați o pagină în plus față de numărul de pagini necesare și să folosiți formula:<​code>​       * Pentru aceasta, va trebui să alocați o pagină în plus față de numărul de pagini necesare și să folosiți formula:<​code>​
Line 118: Line 118:
     * Încărcați modulul în kernel.     * Încărcați modulul în kernel.
     * Pentru testare utilizați testul din directorul ''​test/''​.     * Pentru testare utilizați testul din directorul ''​test/''​.
-      * Compilați testul folosind comanda ''​make''​. 
       * Rulați testul folosind comanda ''​./​mmap-test''​.       * Rulați testul folosind comanda ''​./​mmap-test''​.
       * Dacă totul merge bine testul va afișa mesaje ''​matched''​.       * Dacă totul merge bine testul va afișa mesaje ''​matched''​.
     * Descărcați modulul din kernel.     * Descărcați modulul din kernel.
  
-==== 2. [3p] Mapare de memorie ​virtual contiguă în user space ====+==== 2. [3p] Mapare de memorie ​fizic discontiguă în user space ====
     * Utilizați scheletul de modul de kernel din directorul ''​vmmap/''​ pentru a crea o mapare a memoriei driver-ului în user-space.     * Utilizați scheletul de modul de kernel din directorul ''​vmmap/''​ pentru a crea o mapare a memoriei driver-ului în user-space.
       * Memoria driver-ului este alocată folosind ''​vmalloc''​.       * Memoria driver-ului este alocată folosind ''​vmalloc''​.
-      * Completați zonele marcate cu ''​TODO ​2''​.+      * Completați zonele marcate cu ''​TODO ​1''​.
       * Parcurgeți secțiunea [[:​so2:​laboratoare:​lab11#​Kernel-space|Maparea memoriei. Kernel-space]] din laborator.       * Parcurgeți secțiunea [[:​so2:​laboratoare:​lab11#​Kernel-space|Maparea memoriei. Kernel-space]] din laborator.
     * Alocați ​ o zonă de memorie de ''​NPAGES''​ pagini în funcția de inițializare a modulului folosind ''​vmalloc''​.     * Alocați ​ o zonă de memorie de ''​NPAGES''​ pagini în funcția de inițializare a modulului folosind ''​vmalloc''​.
Line 147: Line 146:
     * Încărcați modulul în kernel.     * Încărcați modulul în kernel.
     * Pentru testare utilizați testul din directorul ''​test/''​.     * Pentru testare utilizați testul din directorul ''​test/''​.
-      * Compilați testul folosind comanda ''​make''​. 
       * Rulați testul folosind comanda ''​./​mmap-test''​.       * Rulați testul folosind comanda ''​./​mmap-test''​.
       * Dacă totul merge bine testul va afișa mesaje ''​matched''​.       * Dacă totul merge bine testul va afișa mesaje ''​matched''​.
Line 157: Line 155:
       * E vorba de un exercițiu didactic ca să vedem că același spațiu poate fi folosit și cu apel-ul ''​mmap''​ și cu apeluri de tipul ''​read''​ și ''​write''​.       * E vorba de un exercițiu didactic ca să vedem că același spațiu poate fi folosit și cu apel-ul ''​mmap''​ și cu apeluri de tipul ''​read''​ și ''​write''​.
       * Operațiile de citire și scriere vor acționa chiar asupra zonei de memorie alocate.       * Operațiile de citire și scriere vor acționa chiar asupra zonei de memorie alocate.
-      * Completați zonele marcate cu ''​TODO ​3''​.+      * Completați zonele marcate cu ''​TODO ​2''​.
       * Revedeți [[so2:​laboratoare:​lab04 | Laboratorul 4]]       * Revedeți [[so2:​laboratoare:​lab04 | Laboratorul 4]]
     * **Ignorați** parametrul ''​offset''​ trimis operației de read/write.     * **Ignorați** parametrul ''​offset''​ trimis operației de read/write.
     * Pentru testare utilizați testul din directorul ''​test/''​.     * Pentru testare utilizați testul din directorul ''​test/''​.
-      * Definiți macroul ​''​TASK_3'' ​în ''​mmap_test.c''​+      * Rulați testul folosind comanda ​''​./mmap-test 3''​. 
 + 
 ==== 4. [3p] Afișare memorie mapată în ''​procfs''​ ==== ==== 4. [3p] Afișare memorie mapată în ''​procfs''​ ====
     * Folosind **unul dintre** modulele anterioare, creați un fișier ''​procfs''​ în care să afișați totalul memoriei mapate de procesul apelant.     * Folosind **unul dintre** modulele anterioare, creați un fișier ''​procfs''​ în care să afișați totalul memoriei mapate de procesul apelant.
-      * Completați zonele marcate cu ''​TODO ​4''​.+      * Completați zonele marcate cu ''​TODO ​3''​.
     * Creați o intrare nouă în ''​procfs''​ (''​PROC_ENTRY_NAME'',​ definit în ''​mmap-test.h''​) care va afișa totalul memoriei mapate de procesul care a apelat read-ul pe acel fișier. Folosiți apelul [[http://​elixir.free-electrons.com/​linux/​v4.9/​source/​include/​linux/​proc_fs.h#​L30|proc_create]].     * Creați o intrare nouă în ''​procfs''​ (''​PROC_ENTRY_NAME'',​ definit în ''​mmap-test.h''​) care va afișa totalul memoriei mapate de procesul care a apelat read-ul pe acel fișier. Folosiți apelul [[http://​elixir.free-electrons.com/​linux/​v4.9/​source/​include/​linux/​proc_fs.h#​L30|proc_create]].
         * Pentru parametrul ''​mode''​ folosiți ''​0'',​ iar pentru parametrul ''​parent''​ folosiți ''​NULL''​.         * Pentru parametrul ''​mode''​ folosiți ''​0'',​ iar pentru parametrul ''​parent''​ folosiți ''​NULL''​.
Line 187: Line 187:
       * Ca al treilea argument pentru ''​single_open''​ puteți folosi ''​NULL''​.       * Ca al treilea argument pentru ''​single_open''​ puteți folosi ''​NULL''​.
     * Pentru testare utilizați testul din directorul ''​test/''​.     * Pentru testare utilizați testul din directorul ''​test/''​.
-      * Definiți ''​TASK_4''​ în ''​mmap_test.c''​+      * Rulați testul folosind comanda ​''​./mmap-test 4''​.
-      * Rulați testul.+
         * Testul așteaptă un timp (are o instrucțiune ''​sleep''​ internă).         * Testul așteaptă un timp (are o instrucțiune ''​sleep''​ internă).
         * Cât timp testul așteaptă, folosiți în altă consolă comanda ''​pmap''​ pentru a vedea mapările testului și a le compara cu cele obținute.         * Cât timp testul așteaptă, folosiți în altă consolă comanda ''​pmap''​ pentru a vedea mapările testului și a le compara cu cele obținute.
           * Puteți folosi comanda în forma<​code>​           * Puteți folosi comanda în forma<​code>​
-pmap $(pidof mmap-test)+cat /proc/$(pidof mmap-test)/maps
 </​code>​ </​code>​
 <​note>​ <​note>​
-          * Pentru a accesa altă consolă ​în mașina virtuală folosiți combinația de taste ''​Alt+F2''​.+          * Pentru a accesa altă consolă ​porniți ​mașina virtuală ​în mod grafic și folosiți combinația de taste ''​Alt+F2''​.
           * Pentru a reveni înapoi în prima consolă folosiți combinația de taste ''​Alt+F1''​.           * Pentru a reveni înapoi în prima consolă folosiți combinația de taste ''​Alt+F1''​.
 </​note>​ </​note>​
so2/laboratoare/lab11/exercitii.1525756900.txt.gz · Last modified: 2018/05/08 08:21 by ionel.ghita
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