阅读:2664回复:3
关于0xC0300000 和 0xC0000000
这几天在看Inside win2000
了解到 0xC0300000 是指向当前进程的页目录地址 她的物理地址则是在 cpu的CR3 寄存器中 但是关于 0xC0000000 则有一点糊涂, (0xC0000000 是第一个页表所在地) 0xC0000000 转换到物理地址又是如何实现的那? 希望各位前辈赐教`` |
|
沙发#
发布于:2003-07-29 15:40
页目录(PDE)由1024项组成,每项均指向一页表(PTE),每一页表也由1024个页组成,IA-32体系每页大小为4K,所以可寻址范围为4G(1024*1024*4K)。Windows中每个进程都拥有其各自的进程地址空间,即拥有其各自的页目录与页表。每个进程均使用线性地址C0300000H指向其特定的页目录所在的地址,而页目录中每项(即页表)均依次排列在线性地址C0000000H处,每个页表均占用4K(1024*4)字节,如第一个页表位于C0000000H处,而第二个页表位于C0000000+1000H(4K),即C0001000中,依次类推,计算公式即为C0000000H+页目录偏移值(线性地址的高10位)*1000H
ULONG LinearAddressToPhysicalAddress(ULONG lAddress) { unsigned int *pAddr; unsigned int *PageDirectoryEntry=(unsigned int *)0xC0300000; unsigned int *PageTableEntry=(unsigned int *)0xC0000000; //判断页目录是否有效,第0位(P)为存在位,请参阅相关书籍 if((!(PageDirectoryEntry[lAddress>>22]&0xFFFFF000)) &&(!(PageDirectoryEntry[lAddress>>22]&0x00000001))) return 0; //@(C0000000h+(LA&0xFFFFF000)>>10d)&0fffff000h+PO 见上叙述 pAddr=(int *)((int)PageTableEntry+((lAddress&0xFFFFF000)>>10)); if((*pAddr)&1) return ((*pAddr) &0xFFFFF000) |(lAddress&0x00000FFF); return 0; } |
|
|
板凳#
发布于:2003-07-29 16:15
楼上搞错了
我的意思是 系统是如何算出 0XC0000000 的物理地址的? |
|
地板#
发布于:2003-07-30 13:50
请问有没有高手知道
0xC0000000 转换为物理地址是多少? |
|