Bagikan melalui


Mengonversi Alamat Virtual ke Alamat Fisik

Sebagian besar perintah debugger menggunakan alamat virtual, bukan alamat fisik, sebagai input dan outputnya. Namun, ada kalanya alamat fisik dapat berguna.

Ada dua cara untuk mengonversi alamat virtual ke alamat fisik: dengan menggunakan ekstensi !vtop, dan dengan menggunakan ekstensi !pte.

Untuk gambaran umum alamat virtual di Windows, lihat Ruang alamat virtual.

konversi alamat menggunakan !vtop

Misalkan Anda men-debug komputer target tempat proses MyApp.exe berjalan dan Anda ingin menyelidiki alamat virtual 0x0012F980. Berikut adalah prosedur yang akan Anda gunakan dengan ekstensi !vtop untuk menentukan alamat fisik yang sesuai.

Mengonversi alamat virtual ke alamat fisik menggunakan !vtop

  1. Pastikan Anda bekerja dalam heksadesimal. Jika perlu, atur basis saat ini dengan perintah N 16.

  2. Tentukan indeks byte dari alamat. Angka ini sama dengan 12 bit terendah dari alamat virtual. Dengan demikian, alamat virtual 0x0012F980 memiliki indeks byte 0x980.

  3. Tentukan basis direktori dari alamat dengan menggunakan ekstensi !process.

    kd> !process 0 0
    **** NT ACTIVE PROCESS DUMP ****
    ....
    PROCESS ff779190  SessionId: 0  Cid: 04fc    Peb: 7ffdf000  ParentCid: 0394
     DirBase: 098fd000  ObjectTable: e1646b30  TableSize:   8.
        Image: MyApp.exe
    
  4. Tentukan nomor bingkai halaman basis direktori. Ini hanyalah basis direktori tanpa tiga nol heksadesimal berikutnya. Dalam contoh ini, basis direktori 0x098FD000, sehingga nomor bingkai halaman 0x098FD.

  5. Gunakan ekstensi !vtop. Parameter pertama ekstensi ini harus berupa nomor bingkai halaman. Parameter kedua !vtop harus menjadi alamat virtual yang dimaksud:

    kd> !vtop 98fd 12f980
    Pdi 0 Pti 12f
    0012f980 09de9000 pfn(09de9)
    

    Angka kedua yang ditunjukkan pada baris akhir adalah alamat fisik awal halaman fisik.

  6. Tambahkan indeks byte ke alamat awal halaman: 0x09DE9000 + 0x980 = 0x09DE9980. Ini adalah alamat fisik yang diinginkan.

Anda dapat memverifikasi bahwa komputasi ini dilakukan dengan benar dengan menampilkan memori di setiap alamat. Ekstensi !d\* menampilkan memori pada alamat fisik tertentu:

kd> !dc 9de9980
# 9de9980 6d206e49 726f6d65 00120079 0012f9f4 In memory.......
# 9de9990 0012f9f8 77e57119 77e8e618 ffffffff .....q.w...w....
# 9de99a0 77e727e0 77f6f13e 77f747e0 ffffffff .'.w>..w.G.w....
# 9de99b0 .....

Perintahd* (Memori Tampilan) menggunakan alamat virtual sebagai argumennya:

kd> dc 12f980
0012f980  6d206e49 726f6d65 00120079 0012f9f4  In memory.......
0012f990  0012f9f8 77e57119 77e8e618 ffffffff  .....q.w...w....
0012f9a0  77e727e0 77f6f13e 77f747e0 ffffffff  .'.w>..w.G.w....
0012f9b0  .....

Karena hasilnya sama, ini menunjukkan bahwa alamat fisik 0x09DE9980 memang sesuai dengan alamat virtual 0x0012F980.

konversi alamat menggunakan !pte

Sekali lagi, asumsikan Anda menyelidiki alamat virtual 0x0012F980 milik proses MyApp.exe. Berikut adalah prosedur yang akan Anda gunakan dengan ekstensi !pte untuk menentukan alamat fisik yang sesuai:

Mengonversi alamat virtual ke alamat fisik menggunakan !pte

  1. Pastikan Anda bekerja dalam heksadesimal. Jika perlu, atur basis saat ini dengan perintah N 16.

  2. Tentukan indeks byte dari alamat. Angka ini sama dengan 12 bit terendah dari alamat virtual. Dengan demikian, alamat virtual 0x0012F980 memiliki indeks byte 0x980.

  3. Atur konteks proses ke proses yang diinginkan:

    kd> !process 0 0
    **** NT ACTIVE PROCESS DUMP ****
    ....
    PROCESS ff779190  SessionId: 0  Cid: 04fc    Peb: 7ffdf000  ParentCid: 0394
        DirBase: 098fd000  ObjectTable: e1646b30  TableSize:   8.
        Image: MyApp.exe
    
    kd> .process /p ff779190
    Implicit process is now ff779190
    .cache forcedecodeuser done
    
  4. Gunakan ekstensi!pte dengan alamat virtual sebagai argumennya. Ini menampilkan informasi dalam dua kolom. Kolom kiri menjelaskan entri direktori halaman (PDE) untuk alamat ini; kolom kanan menjelaskan entri tabel halamannya (PTE):

    kd> !pte 12f980
                   VA 0012f980
    PDE at   C0300000        PTE at C00004BC
    contains 0BA58067      contains 09DE9067
    pfn ba58 ---DA--UWV    pfn 9de9 ---DA--UWV
    
  5. Lihat di baris terakhir kolom kanan. Notasi "pfn 9de9" muncul. Angka 0x9DE9 adalah nomor bingkai halaman (PFN) dari PTE ini. Kalikan nomor bingkai halaman dengan 0x1000 (misalnya, geser ke kiri 12 bit). Hasilnya, 0x09DE9000, adalah alamat fisik dari awal halaman.

  6. Tambahkan indeks byte ke alamat awal halaman: 0x09DE9000 + 0x980 = 0x09DE9980. Ini adalah alamat fisik yang diinginkan.

Ini adalah hasil yang sama yang diperoleh dengan metode sebelumnya.

Mengonversi Alamat Dengan Tangan

Meskipun ekstensi !ptov dan pte menyediakan cara tercepat untuk mengonversi alamat virtual ke alamat fisik, konversi ini juga dapat dilakukan secara manual. Deskripsi proses ini akan menjelaskan beberapa detail arsitektur memori virtual.

Struktur memori bervariasi dalam ukuran, tergantung pada prosesor dan konfigurasi perangkat keras. Contoh ini diambil dari sistem x86 yang tidak mengaktifkan Ekstensi Alamat Fisik (PAE).

Menggunakan 0x0012F980 lagi sebagai alamat virtual, Anda harus terlebih dahulu mengonversinya menjadi biner, baik dengan tangan atau dengan menggunakan perintah.formats (Tampilkan Format Angka):

kd> .formats 12f980
Evaluate expression:
  Hex:     0012f980
  Decimal: 1243520
  Octal:   00004574600
  Binary:  00000000 00010010 11111001 10000000
  Chars:   ....
  Time:    Thu Jan 15 01:25:20 1970
  Float:   low 1.74254e-039 high 0
  Double:  6.14381e-318

Alamat virtual ini adalah kombinasi dari tiga bidang. Bit 0 hingga 11 adalah indeks byte. Bit 12 hingga 21 adalah indeks tabel halaman. Bit 22 hingga 31 adalah indeks direktori halaman. Ketika memisahkan bidang, Anda memiliki:

0x0012F980  =  0y  00000000 00   010010 1111   1001 10000000

Ini mengekspos tiga bagian alamat virtual:

  • Indeks direktori halaman = 0y0000000000 = 0x0

  • Indeks tabel halaman = 0y0100101111 = 0x12F

  • Indeks byte = 0y100110000000 = 0x980

Anda kemudian memerlukan tiga informasi tambahan untuk sistem Anda.

  • Ukuran setiap PTE. Ini adalah 4 byte pada sistem non-PAE x86.

  • Ukuran halaman. Ini 0x1000 bajt.

  • Alamat virtual PTE_BASE. Pada sistem non-PAE, ini 0xC0000000.

Dengan menggunakan data ini, Anda dapat menghitung alamat PTE itu sendiri:

PTE address   =   PTE_BASE  
                + (page directory index) * PAGE_SIZE
                + (page table index) * sizeof(MMPTE)
              =   0xc0000000
                + 0x0   * 0x1000
                + 0x12F * 4
              =   0xC00004BC

Ini adalah alamat PTE. PTE adalah DWORD 32-bit. Periksa isinya:

kd> dd 0xc00004bc L1
c00004bc  09de9067

PTE ini memiliki nilai 0x09DE9067. Ini terdiri dari dua bidang.

  • 12 bit terendah dari PTE merupakan bendera status . Dalam hal ini, bendera ini sama dengan 0x067 -- atau dalam biner, 0y000001100111. Untuk penjelasan tentang bendera status, lihat halaman referensi !pte.

  • 20 bit tinggi dari PTE sama dengan nomor bingkai halaman (PFN) dari PTE. Dalam hal ini, PFN adalah 0x09DE9.

Alamat fisik pertama di halaman fisik adalah PFN dikalikan dengan 0x1000 (digeser ke kiri 12 bit). Indeks byte adalah offset pada halaman ini. Dengan demikian, alamat fisik yang Anda cari adalah 0x09DE9000 + 0x980 = 0x09DE9980. Ini adalah hasil yang sama yang diperoleh dengan metode sebelumnya.