240 likes | 289 Views
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.
E N D
ManajemenMemoripada Linux: Noncontiguous Memory Area Management Dwinanto Cahyo (13505025) Ibnu Sina Wardy (13505035) Reisha Humaira (13505047) Nurio Juliandatu Masido (13505083)
Memory Management • Penggunaan RAM oleh kernel • Untukmenyimpankode • Untukmenyimpanstruktur data statis • Memoridinamis • Digunakanoleh kernel • Digunakanolehproses • Teknikmanajemenmemorioleh kernel • Area memorikontigu • Area memori non-kontigu
Contiguous vs. Noncontiguous • Area memori non-kontigubaikdigunakanketikapermintaanaksesterhadap area memoritidakterlaluseringataucenderungsedikit • Penggunaan area memori non-kontigumemberikanalternatiflangkahuntukmenggunakanmemori level ataspadaPage Frame
Alokasi struktur data untuk swap area aktif • Alokasi space untuk modul kerja • Alokasi buffer untuk perangkat I/O
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
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
Linear Address 3 The linear address interval starting from PAGE_OFFSET
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; }
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
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
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 …
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
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
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; }
Allocation 3 • Fungsimap_vm_area() memeriksapage table entries yang digunakan kernel untukmengindikasibahwasetiappage frame yang telahteralokasike area memori non-kontigutelahberasosiasidengansebuahlinearaddress yang termasukdalam interval darilinearaddresskontiguhasildarivmalloc()
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; }
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()
Allocation 6 • Fungsivmalloc_32()jugadapatdigunakanuntukalokasi, tapihanyamengalokasikanpageframedarizonamemoriZONE_NORMALdanZONE_DMA
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()
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())
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)
Referensi http://www.linux-security.cn/ebooks/ulk3-html/0596005652/understandlk-CHP-8-SECT-3.html