(bagian 3 dari 7 artikel - ke artikel utama - ke bagian 4)
Bahkan terdapat arsitektur yang mempunyai ukuran halaman yang bervariasi. Perbedaan ini bisa disebabkan perbedaan opsi (seperti pada IA-64) atau perbedaan varian prosesor (seperti pada ARM). Potongan program drivers/usb/class/audio.c di bawah ini memperlihatkan bagaimana kedua parameter: PAGE_SHIFT dan PAGE_SIZE digunakan untuk akses memori:
Seperti dijelaskan di Tipe data kernel internal dari contoh yang diambil dari berkas drivers/char/serial.c, program dapat meminta alokasi halaman memori ke kernel. Ukuran halaman memori tidak selalu 4KB (seperti pada arsitektur i386). Karena itu, untuk merujuk suatu halaman memori, harus digunakan parameter PAGE_SHIFT dan PAGE_SIZE.
PAGE_SHIFT adalah banyaknya pergeseran bit ke kiri (bit shift left) agar diperoleh nilai PAGE_SIZE. Arsitektur yang berbeda mempunyai nilai parameter yang berbeda, seperti yang ditampilkan pada tabel di bawah ini.Arsitektur | PAGE_SHIFT | PAGE_SIZE |
i386 | 12 | 4K |
MIPS | 12 | 4K |
Alpha | 13 | 8K |
m68k | 12 | 4K |
m68k | 13 | 8K |
ARM | 12 | 4K |
ARM | 14 | 16K |
ARM | 15 | 32K |
IA-64 | 12 | 4K |
IA-64 | 13 | 8K |
IA-64 | 14 | 16K |
IA-64 | 16 | 64K |
Bahkan terdapat arsitektur yang mempunyai ukuran halaman yang bervariasi. Perbedaan ini bisa disebabkan perbedaan opsi (seperti pada IA-64) atau perbedaan varian prosesor (seperti pada ARM). Potongan program drivers/usb/class/audio.c di bawah ini memperlihatkan bagaimana kedua parameter: PAGE_SHIFT dan PAGE_SIZE digunakan untuk akses memori:
static int dmabuf_mmap(...)
{
size >>= PAGE_SHIFT;
for(nr = 0; nr < size; nr++)
if (!db->sgbuf[nr])
return -EINVAL;
db->mapped = 1;
for (nr = 0; nr < size; nr++) {
unsigned long pfn;
pfn = virt_to_phys(db->sgbuf[nr]) >> PAGE_SHIFT;
if (remap_pfn_range(vma, start, pfn, PAGE_SIZE, prot))
return -EAGAIN;
start += PAGE_SIZE;
}
return 0;
}
Tidak ada komentar:
Posting Komentar