Upload presentasi
Presentasi sedang didownload. Silahkan tunggu
Diterbitkan olehDavid Agus Telah diubah "10 tahun yang lalu
1
Dwinanto Cahyo (13505025) Ibnu Sina Wardy (13505035) Reisha Humaira (13505047) Nurio Juliandatu Masido (13505083) Manajemen Memori pada Linux: Noncontiguous Memory Area Management
2
Memory Management Penggunaan RAM oleh kernel Untuk menyimpan kode Untuk menyimpan struktur data statis Memori dinamis Digunakan oleh kernel Digunakan oleh proses Teknik manajemen memori oleh kernel Area memori kontigu Area memori non-kontigu
3
Contiguous vs. Noncontiguous Area memori non-kontigu baik digunakan ketika permintaan akses terhadap area memori tidak terlalu sering atau cenderung sedikit Penggunaan area memori non-kontigu memberikan alternatif langkah untuk menggunakan memori level atas pada Page Frame Skema Alokasi Memori Pemetaan Area Memori ke Page Frame Kontigu Page Frame Non-Kontigu melalui Linear Address Kontigu Penggunaan cache lebih maksimalMenghindari fragmentasi eksternal Waktu akses memori lebih rendahBekerja dengan page table kernel
4
Alokasi struktur data untuk swap area aktif Alokasi space untuk modul kerja Alokasi buffer untuk perangkat I/O
5
Linear Address Salah satu jenis alamat memori pada arsitektur mikroprosesor Intel 80×86 Merupakan penghubung antara segmentation unit dan paging unit 32-bit unsigned integer tunggal yang dapat digunakan untuk pengalamatan hingga 4 GB Umumnya berupa notasi heksadesimal 1
6
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 2
7
The linear address interval starting from PAGE_OFFSET Linear Address 3
8
Struktur data vm_struct untuk mendeskripsikan area memori non-kontigu struct vm_struct { unsigned long flags; void *addr; unsigned long size; struct vm_struct *next; } Descriptor 1
9
TipeNamaDeskripsi void*addr Linear address dari satuan memori pada suatu area. unsigned longsize Ukuran area ditambah dengan 4.096 (interval aman inter-area) unsigned longflags Tipe memori yang dipetakan oleh memori area non- kontigu struct page **pages Pointer pada array of nr_pages pointer pada deksripsi page unsigned intnr_pages Jumlah page yang diisi oleh area unsigned longphys_addr Berisi 0 hingga area sudah diciptakan untuk memetakan I/O shared memory pada suatu perangkat keras. struct vm_struct *next Pointer ke struktur vm_struct selanjutnya. Descriptor 2
10
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 3
11
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 4
12
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 5
13
Jika interval tersedia: o fungsi kmalloc() menginisialisasikan atribut dari deskriptor o melepas kunci dari vmlist_lock o menghentikan proses dengan mengembalikan initial address dari ares memori non-kontigu Jika interval tidak tersedia: oget_vm_area() melepaskan deksriptor yang didapatkan sebelumnya o melepaskan kunci pada vmlist_lock o mengembalikan NULL Descriptor 6
14
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 Allocation 1
15
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 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; } 2
16
Fungsi map_vm_area() memeriksa page table entries yang digunakan kernel untuk mengindikasi bahwa setiap page frame yang telah teralokasi ke area memori non-kontigu telah berasosiasi dengan sebuah linear address yang termasuk dalam interval dari linear address kontigu hasil dari vmalloc() Allocation 3
17
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 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; } 4
18
Fungsi pud_alloc() untuk menciptakan Page Upper Directory Fungsi map_area_pud() mengalokasikan semua page table yang ditunjuk oleh PUD yang baru Fungsi map_area_pud() akan menginvokasi pmd_alloc() Fungsi map_area_pmd() akan menginvokasi pte_alloc_kernel() Allocation 5
19
Fungsi vmalloc_32() juga dapat digunakan untuk alokasi, tapi hanya mengalokasikan page frame dari zona memori ZONE_NORMAL dan ZONE_DMA Allocation 6
20
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 1
21
Fungsi _ _vunmap() mempunyai dua parameter addr, menyatakan alamat initial 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 2
22
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) Release 3
23
Referensi http://www.linux-security.cn/ebooks/ulk3- html/0596005652/understandlk-CHP-8-SECT- 3.html
24
Terima Kasih
Presentasi serupa
© 2024 SlidePlayer.info Inc.
All rights reserved.