Saya mencoba menjalankan struktur paging secara manual untuk mengubah alamat virtual menjadi alamat fisiknya. Saya punya pertanyaan tentang bidang alamat dasar fisik yang disimpan di PML4E, PDPE, PDE, dan PTE. Ukuran halaman di sistem saya adalah 4KB. Saya melakukan ini di Windows dalam mode kernel.

Seperti yang dikatakan manual amd64, bit 51-12 dari cr3 berisi alamat dasar fisik PML4. Namun, ia mengatakan bahwa bit 11-0 harus diasumsikan sebagai 0. Saya bertanya-tanya apakah hal yang sama berlaku untuk bidang alamat dasar dari struktur paging lainnya, karena diagram yang menggambarkan proses terjemahan mengatakan 52, namun ukuran sebenarnya adalah hanya 40 (bit 51-12).

enter image description here

Contoh bagaimana saya melakukan terjemahan di C:

// clear out everything except base address field
ULONG_PTR pPml4 = __readcr3() & ~0xFFF0000000000FFF,
    dataEntry;

copyAddress.PhysicalAddress.QuadPart = pPml4 + (sourceAddress.Hard.PageMapLevel4Index * 8);

if (MmCopyMemory(&dataEntry, copyAddress, 8, MM_COPY_MEMORY_PHYSICAL, &trans) != STATUS_SUCCESS) {
    ...
}

// dataEntry now has correct PML4E

// clear out everything except base address field
dataEntry &= ~0xFFF0000000000FFF;

// do I skip this?
dataEntry >>= 12;
2
Arush Agarampur 19 April 2021, 21:29

1 menjawab

Jawaban Terbaik

Dari bagian 5.4 dari manual:

Bidang Alamat Dasar Tabel Terjemahan. Bidang alamat-dasar tabel terjemahan menunjuk ke alamat dasar fisik tabel tingkat bawah berikutnya dalam hierarki terjemahan halaman. Tabel struktur data halaman selalu disejajarkan pada batas 4-Kbyte, jadi hanya bit alamat di atas bit 11 yang disimpan di bidang alamat-dasar tabel terjemahan. Bit 11:0 diasumsikan 0. Ukuran bidang tergantung pada mode...

Jadi ya, 12 bit rendah adalah 0 untuk membuat alamat fisik 52-bit.

3
Arush Agarampur 19 April 2021, 18:40