This shows you the differences between two versions of the page.
so2:laboratoare:lab11:exercitii [2018/05/08 18:15] 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 122: | Line 122: | ||
* 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 155: | 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. | ||
Line 164: | Line 164: | ||
==== 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 191: | Line 191: | ||
* 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> |