หลังจากที่ได้เขียน lsproc จนสามารถทำงานกับ Windows 2000, xp และ 2003 ไปแล้วนั้น ก็เลยมีความคิดที่จะเขียนโปรแกรมอันใหม่ให้มันทำอะไรได้มากกว่านั้น เหมือนๆกับ lspd ของ Harlan Carvey (ความจริงคือจะเอา lspd มาดัดแปลงให้ทำงานกับหลายๆระบบปฏิบัติการได้นั่นแหละ แหะๆ) แต่หลังจากที่ไล่ดูโค้ดแล้วก็รู้สึกว่ามี concept บางอย่างที่จำเป็นที่จะต้องทำความเข้าใจก่อนที่จะลงไปในระดับลึก concept ที่ว่าคือการเปลี่ยน virtual address เป็น physical address นั่นเอง
ในการเปลี่ยน virtual address เป็น physical address นั้น สิ่งที่จำเป็นจะต้องทราบมีอยู่ดังต่อไปนี้
- virtual address ที่เราต้องการเปลี่ยนเป็น physical address
- Page Directory Base ซึ่งเราสามารถหาได้จากตำแหน่งที่ 0x18 จากตำแหน่งเริ่มต้นของ EPROCESS ีซึ่งค่านี้คงที่สำหรับระบบปฏิบัติการ Windows 2000 SP4 จนถึง Windows Vista เลยทีเดียว
เมื่อทราบค่าทั้ง 2 ค่าแล้ว ขั้นตอนในการเปลี่ยนค่ามีดังต่อไปนี้
- ทำการแบ่ง virtual address ซึ่งมีขนาด 32 bits ออกเป็นสามส่วนด้วยกันคือ bit 1 - 12 ทำหน้าที่เป็น byte index, bit ที่ 13 -22 ทำหน้าที่เป็น page table index และ bit ที่ 23 - 32 ทำหน้าที่เป็น page directory index
- นำค่า page directory base (pdb) และ page directory index (pdi) มาคำนวนหาตำแหน่งของ page table โดยใช้สูตร: pdb + (pdi * 4) = ตำแหน่งของ page table ใน physical memory
- อ่านค่า page table ใน physical memory จากนั้นทำการตรวจสอบ bit ที่ 1 (present bit) ว่าเป็น 1 หรือไม่ การที่ present bit เป็น 1 หมายถึง page นั้นยังอยู่ใน memory
- ทำการคำนวนค่า page table base (ptb) ได้จาก สูตร: ptb = (page table >> 12) * 0x1000
- ทำการคำนวนหาค่าตำแหน่งของ page table entry ใน Physical Memory โดยใช้สูตร: ptb + (pti * 4) = ตำแหน่งของ page table entry
- อ่านค่า page table entry ใน physical memory จากนั้นทำการตรวจสอบ bit ที่ 1 (present bit) ว่าเป็น 1 หรือไม่ การที่ present bit เป็น 1 หมายถึง page นั้นยังอยู่ใน memory
- ทำการคำนวนค่า page base address (pba) ได้จากสูตร pba = (page table entry >> 12) * 0x1000
- ทำการคำนวน physical address ได้จากสูตร pba + byte index
1 ความคิดเห็น:
หวัดดี แวะมาเยี่ยมเยียน
แสดงความคิดเห็น