16.8.08

Masalah memori

(bagian 3 dari 7 artikel - ke artikel utama - ke bagian 4)

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.

ArsitekturPAGE_SHIFTPAGE_SIZE
i386124K
MIPS124K
Alpha138K
m68k124K
m68k138K
ARM124K
ARM1416K
ARM1532K
IA-64124K
IA-64138K
IA-641416K
IA-641664K

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: