1 / 24

Noncontiguous Memory Area Management

This paper discusses noncontiguous memory management in Linux, covering RAM usage, dynamic memory, kernel utilization, and process handling. It compares contiguous and noncontiguous memory areas, detailing allocation techniques and addressing mechanisms. Linear addressing, page frames, and data structures for memory mapping are explained, along with practical functions like vmalloc and map_vm_area. The paper analyzes kernel memory segmentation, interval separation, and descriptor handling for efficient memory allocation.

jalila
Download Presentation

Noncontiguous Memory Area Management

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ManajemenMemoripada Linux: Noncontiguous Memory Area Management Dwinanto Cahyo (13505025) Ibnu Sina Wardy (13505035) Reisha Humaira (13505047) Nurio Juliandatu Masido (13505083)

  2. Memory Management • Penggunaan RAM oleh kernel • Untukmenyimpankode • Untukmenyimpanstruktur data statis • Memoridinamis • Digunakanoleh kernel • Digunakanolehproses • Teknikmanajemenmemorioleh kernel • Area memorikontigu • Area memori non-kontigu

  3. Contiguous vs. Noncontiguous • Area memori non-kontigubaikdigunakanketikapermintaanaksesterhadap area memoritidakterlaluseringataucenderungsedikit • Penggunaan area memori non-kontigumemberikanalternatiflangkahuntukmenggunakanmemori level ataspadaPage Frame

  4. Alokasi struktur data untuk swap area aktif • Alokasi space untuk modul kerja • Alokasi buffer untuk perangkat I/O

  5. Linear Address 1 • Salahsatujenisalamatmemoripadaarsitekturmikroprosesor Intel 80×86 • Merupakanpenghubungantarasegmentation unitdanpaging unit • 32-bit unsigned integer tunggal yang dapat digunakan untuk pengalamatan hingga 4 GB • Umumnyaberupa notasi heksadesimal

  6. Linear Address 2 • Kernel menggunakan bagian awal dari memori yang dimulai dari PAGE_OFFSET • Semua linear address setelah PAGE_OFFSET dapat digunakan untuk memetakan berbagai area memori non-kontigu • Setiap area memori dipisahkan oleh interval sebesar 4-8 KB • Untuk mencari interval linear address dapat dimulai dari PAGE_OFFSET

  7. Linear Address 3 The linear address interval starting from PAGE_OFFSET

  8. Descriptor 1 • Struktur data vm_struct untuk mendeskripsikan area memori non-kontigu structvm_struct { unsigned long flags; void *addr; unsigned long size; structvm_struct *next; }

  9. Descriptor 2

  10. Descriptor 3 • Deskriptor disimpan pada sebuah list sederhana • Alamat dari elemen pertama dari list disimpan pada variabel vmlist • Akses ke list ini bersifat protected dikarenakan oleh read/write spin lock pada vmlist_lock

  11. Descriptor 4 • Fungsi get_vm_area() untuk membuat deskriptor baru dari tipe vm_struct • Fungsi get_vm_area() mempunyai dua parameter • size, menyatakan ukuran memori dalam bytes • flag, menspesifikasikan tipe region

  12. Descriptor 5 • Operasi yang dilakukan • Invokasi kmalloc() untuk mendapatkan area memori • Mengunci dengan vmlist_lock untuk mencari interval kosong dari linear address yang sudah mengandung paling tidak sebesar size + 4096 • Jika interval tersedia … • Jika interval tidak tersedia …

  13. Descriptor 6 • Jika interval tersedia: • fungsi kmalloc() menginisialisasikan atribut dari deskriptor • melepas kunci dari vmlist_lock • menghentikan proses dengan mengembalikan initial address dari ares memori non-kontigu • Jika interval tidak tersedia: • get_vm_area()melepaskan deksriptor yang didapatkan sebelumnya • melepaskan kunci pada vmlist_lock • mengembalikan NULL

  14. Allocation 1 • Fungsi vmalloc() untuk mengalokasikan sebuah area memori non-kontigu pada kernel • Parameter size menyatakan ukuran area yang dibutuhkan • Jika berhasil, mengembalikan initial linear address area yang baru • Jika gagal, mengembalikan NULL

  15. 2 void * vmalloc (unsigned long size) { struct vm_struct *area; struct page **pages; unsigned int array_size, i; size = (size + PAGE_SIZE - 1) & PAGE_MASK; area = get_vm_area(size, VM_ALLOC); if (!area) return NULL; area->nr_pages = size >> PAGE_SHIFT; array_size = (area->nr_pages * sizeof(struct page *)); area->pages = pages = kmalloc(array_size, GFP_KERNEL); if (!area_pages) { remove_vm_area(area->addr); kfree(area); return NULL; } memset(area->pages, 0, array_size); for (i=0; i<area->nr_pages; i++) { area->pages[i] = alloc_page(GFP_KERNEL|_ _GFP_HIGHMEM); if (!area->pages[i]) { area->nr_pages = i; fail: vfree(area->addr); return NULL; } } if (map_vm_area(area, _ _pgprot(0x63), &pages)) goto fail; return area->addr; }

  16. Allocation 3 • Fungsimap_vm_area() memeriksapage table entries yang digunakan kernel untukmengindikasibahwasetiappage frame yang telahteralokasike area memori non-kontigutelahberasosiasidengansebuahlinearaddress yang termasukdalam interval darilinearaddresskontiguhasildarivmalloc()

  17. 4 map_vm_area(vm_struct * area, int prot, struct page *** pages) { address = area->addr; // awal area end = address + (area->size - PAGE_SIZE); // akhir area pgd = pgd_offset_k(address); spin_lock(&init_mm.page_table_lock); //acquires the kernel Page Table spin lock int ret = 0; for (i = pgd_index(address); i < pgd_index(end-1); i++) { pud_t *pud = pud_alloc(&init_mm, pgd, address); //create a Page Upper Directory ret = -ENOMEM; if (!pud) break; next = (address + PGDIR_SIZE) & PGDIR_MASK; if (next < address || next > end) next = end; if (map_area_pud(pud, address, next, prot, pages)) break; address = next; pgd++; ret = 0; } spin_unlock(&init_mm.page_table_lock); flush_cache_vmap((unsigned long)area->addr, end); return ret; }

  18. Allocation 5 • Fungsipud_alloc() untukmenciptakan Page Upper Directory • Fungsimap_area_pud()mengalokasikansemuapagetable yang ditunjukoleh PUD yang baru • Fungsimap_area_pud() akanmenginvokasipmd_alloc() • Fungsimap_area_pmd() akanmenginvokasipte_alloc_kernel()

  19. Allocation 6 • Fungsivmalloc_32()jugadapatdigunakanuntukalokasi, tapihanyamengalokasikanpageframedarizonamemoriZONE_NORMALdanZONE_DMA

  20. Release 1 Fungsi vfree() untuk membebaskan area memori non-kontigu yang di-create oleh fungsi vmalloc() atau vmalloc_32() Fungsi vunmap()untuk membebaskan area memori non-kontigu yang di-create oleh fungsi vmap() Parameter alamat initial linear address dari area yang akan dibebaskan Bergantung pada fungsi _ _vunmap()

  21. Release 2 • Fungsi _ _vunmap() mempunyai dua parameter • addr, menyatakan alamatinitial linear address dari area yang akan dibebaskan • deallocate_pages, menyatakan set jika page frame yang dipetakan ke area harus dibebaskan ke zoned page frame allocator (invokasi vfree()) atau sebaliknya (invokasi vunmap())

  22. Release 3 • Operasi yang dilakukan • Invokasi fungsi remove_vm_area() • Jika deallocate_pages diset, area->pages (array of pointers to the page descriptor) akan di-scan • Invokasi kfree(area)

  23. Referensi http://www.linux-security.cn/ebooks/ulk3-html/0596005652/understandlk-CHP-8-SECT-3.html

  24. Terima Kasih

More Related