Page fisik adalah satuan dasar memori dari kernel linux. ukuran page fisik berbeda pada masing-masing arsitektur hardware, tapi kebanyakan pada mesin 32 bit ukuran 1 page adalah 4KB dan untuk 64 bit, 8KB. Satuan dasar maksudnya satuan terkecil, bisa diibaratkan seperti atom, satuan terkecil yang tidak bisa dibagi-bagi lagi atau pixel dalam foto. Walaupun satuan terkecil yang bisa di alamatkan itu 1 byte atau 8 bit, tapi dalam mengalokasikan memori kernel memakai satuan page sebagai yang terkecil.
Ini membuat terkadang ketika memakai fungsi kmalloc, terkadang kernel akan memberi memori lebih dari yang diminta tapi tidak pernah kurang
Untuk setiap page fisik yang ada, punya struct page (di definisikan di <linux/mm_types.h> ) .untuk mewakilinya, isi dari struct page adalah :
struct page untuk setiap page fisik pada, sebagai efek buruknya kernel harus merelakan beberapa persen untuk mengalokasikan struct page. Yah, persen karena semakin besar memori, semakin banyak juga page yang ada dan semakin banyak juga struct page yang ada.
dari semua page, ada sebuah grup-grup. Grup-grup ini adalah zona, page yang berada di zona (<linux/mmzone.h>) berbeda di perlakukan berbeda oleh kernel. Zona-zonanya terdiri dari :
-ZONE_DMA
-ZONE_NORMAL
-ZONA_HIGHMEM
Pada x86-32 ZONE_DMA ada pada 0-16MB memori fisik, ZONE_HIGHMEM berada pada diatas 896MB, sedangkan ZONE_NORMAL berada diantara pada ZONE_DMA dan ZONE_HIGHMEM.
Ketika melakukan alokasi memori, kernel tidak akan mencampur 2 zona. Maksudnya, jika Zona akan mengambil page dari ZONE_NORMAL maka semua pagenya akan berasal dari ZONE_NORMAL.
Untuk mengalokasikan page bisa memakai
Kebanyakan kasus, kita akan memakai fungsi yang akan disebutkan berikut, nilai kembaliannya adalah alamt virtual dari page yang di alokasikan
Perbedaan kedua fungsi hanya nilai kembaliannya. gfp_mask adalah flag keterangan bagaimana mengalokasikan memorinya (<linux/types.h>). order adalah page yang akan di alokasikan yaitu 2 pangkat order, (yup, 1 << order jika pada bit level). Contoh parameter order bernilai 4, maka 2 pangkat 4 adalah 16, artinya akan di alokasikan 16 page untuk digunakan. Jika memakai sistem 32 bit artinya 16 * 4 adalah 64KB memori yang akan di alokasikan.
untuk merelease memori setelah di pakai :
Fungsi pertama untuk merelease dari alloc_pages dan yang kedua untuk __get_free_pages.
Pesan terakhir selalu ingat, alokasi memori bisa gagal, jadi selalu handle nilai kembalian dari fungsi alokasi, sebagai contoh :
Komentar
Posting Komentar