Presentasi sedang didownload. Silahkan tunggu

Presentasi sedang didownload. Silahkan tunggu

Dwinanto Cahyo (13505025) Ibnu Sina Wardy (13505035) Reisha Humaira (13505047) Nurio Juliandatu Masido (13505083) Manajemen Memori pada Linux: Noncontiguous.

Presentasi serupa


Presentasi berjudul: "Dwinanto Cahyo (13505025) Ibnu Sina Wardy (13505035) Reisha Humaira (13505047) Nurio Juliandatu Masido (13505083) Manajemen Memori pada Linux: Noncontiguous."— Transcript presentasi:

1 Dwinanto Cahyo ( ) Ibnu Sina Wardy ( ) Reisha Humaira ( ) Nurio Juliandatu Masido ( ) 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 (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  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 html/ /understandlk-CHP-8-SECT- 3.html

24 Terima Kasih


Download ppt "Dwinanto Cahyo (13505025) Ibnu Sina Wardy (13505035) Reisha Humaira (13505047) Nurio Juliandatu Masido (13505083) Manajemen Memori pada Linux: Noncontiguous."

Presentasi serupa


Iklan oleh Google