Memahami Address Translation Di Windows


Pada sebuah PC, pengguna menyimpan program secara permanen pada media seperti hard disk drive (HDD). Ukuran hard disk yang tersedia saat ini mulai dari 20 GB hingga 2 TB. Sudah bisa ditebak, pasti ada banyak program yang dapat disimpan di hard disk. Lalu, bagaimana dengan fakta bahwa untuk menjalankan sebuah program, ia harus di-load ke main memory (RAM) terlebih dahulu? Ukuran sebuah keping tunggal main memory saat ini tersedia mulai dari 1 GB hingga 64 GB. Sebuah motherboard PC biasanya menyediakan maksimal 8 slot kosong. Walaupun demikian, ukuran main memory (RAM) tidak akan pernah menyamai ukuran hard disk drive (HDD)!

Pertanyaannya: seandainya saya men-install sebuah program berukuran 4 GB ke harddisk, kenapa saya bisa menjalankan program tersebut pada RAM yang hanya sebesar 1 GB? Hal ini karena sistem operasi menggunakan teknik paging untuk menciptakan sebuah ilusi bahwa PC memiliki main memory yang tidak terbatas. Ketika memori menjadi penuh, sistem operasi menyimpan page lama yang jarang diakses ke hard disk. Ketika program perlu mengakses page yang tidak ada di main memory, akan terjadi page fault. Sistem operasi memberikan respon dengan membaca page yang sebelumnya telah disimpan ke hard disk dan mengisinya di main memory. Semakin kecil ukuran main memory, maka kemungkinan page fault terjadi akan semakin besar. Hal ini terlihat dari lampu indikator hard disk yang semakin sering berkedip dimana efeknya adalah program berjalan lebih lambat.

Hal yang erat kaitannya dengan paging adalah virtual memory. Dengan virtual memory, program menganggap bahwa dirinya mengakses lokasi memori yang sama dan berurut. Padahal, lokasi memori ini adalah virtual address dan bukan lokasi memori yang sesungguhnya! Sistem operasi nantinya akan menerjemahkan dari virtual address ke lokasi memori fisik yang sesungguhnya. Dua program berbeda boleh saja merasa dirinya mengakses lokasi memori yang sama (secara kode program), tapi pada saat dijalankan, sistem operasi bisa saja memetakannya ke lokasi fisik yang berbeda di main memory. Dengan demikian, pembuat program tidak perlu khawatir dengan bentrokan alamat memori bila terdapat lebih dari satu program yang dijalankan secara bersamaan (multitasking).

Sebagai contoh, saya membuka Notepad dan mengetik “thesolidsnake”. Saya menemukan bahwa string tersebut disimpan di lokasi virtual address 0x0029E0F0. Bagaimana caranya Windows menerjemahkan virtual address ke physical address di main memory?

Eksperimen dengan Windows Debugger menunjukkan bahwa physical address untuk 0x0029E0F0 (pada proses notepad.exe) adalah 0x4b3140f0 seperti yang terlihat pada gambar berikut ini:

Mencari physical address dari virtual address

Mencari physical address dari virtual address

Pada gambar di atas, saya menggunakan perintah !vtop untuk melakukan translasi dari virtual address menjadi physical address. Kemudian, saya menggunakan perintah !dc yang menerima parameter berupa physical address untuk menampilkan isi memori pada alamat tertentu.

Bagaimana proses perhitungannya secara manual? Dengan anggapan bahwa sistem tidak mendukung PAE, saya akan mengubah nilai 0x0029E0F0 ke dalam bilangan binary dan membaginya menjadi seperti:

0000 0000 00 | 10 1001 1110  | 0000 1111 0000
|            |               |
|            |               |- Byte index
|            |
|            |- Page table index
|
|- Page directory index

Terlihat bahwa nilai dari page directory index adalah 0, nilai dari page table index adalah 0x29E, dan nilai dari byte index adalah 0xF0. Saya dapat memperoleh lokasi page table entry (PTE) dengan menggunakan rumus berikut ini:

PTE address = PTE_BASE + (page directory index) * PAGE_SIZE + (page table index) * sizeof(MMPTE)
            = 0xC0000000 + (0 * 0x1000) + (0x29E * 4)
            = 0xC0000000 + 0 + 0xA78
            = 0xC0000A78

Setelah menemukan lokasi PTE, saya dapat melihat isinya dengan perintah seperti pada gambar berikut ini:

Melihat PTE untuk proses Notepad.exe

Melihat PTE untuk proses Notepad.exe

Saya berpindah ke context untuk proses Notepad.exe agar perintah dd dapat menampilkan lokasi yang tepat. Hal ini karena setiap proses memiliki page table-nya masing-masing dan saya sedang mencari page table entry (PTE) untuk proses Notepad.exe.

Pada gambar di atas, terlihat bahwa saya menemukan nilai PTE berupa 0x4b314867. Nilai ini terdiri atas nilai page frame number berupa 0x4b314 dan status flag berupa 0x867. Dengan demikian, lokasi physical address adalah:

physical address = page frame number  * 0x1000 + byte index
                 = 0x4B314 * 0x1000 + 0xF0
                 = 0x4B3140F0

Terlihat bahwa hasil perhitungan manual ini sama seperti hasil perhitungan yang diperoleh oleh !vtop.

Perihal Solid Snake
I'm nothing...

One Response to Memahami Address Translation Di Windows

  1. Ping-balik: Memahami Manajemen Memori Fisik Di Windows 7 | The Solid Snake

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: