首页
社区
课程
招聘
[求助]其实这样理解虚拟地址和物理地址更简单
发表于: 2009-6-13 11:08 4977

[求助]其实这样理解虚拟地址和物理地址更简单

2009-6-13 11:08
4977
对于虚拟地址和物理地址的区别,一直是心里明白,很难用一两句话说清楚
其实可以这样理解:

在保护模式下,CPU的运算部件(ALU)向内存管理部件(MMU)发出的地址是虚拟地址,它的宽度决定应用程序的空间大小,而内存管理部件(MMU)和外部地址总线发出的地址是物理地址,它的宽度决定了系统可用物理内存的大小。

在实模式下,内存管理部件将运算部件发过来的地址原封不动的转发到外部地址总线上,所以运算部件发出的地址就是物理地址。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
2
下保护模式的内容..这些都是基础的东西... ..
NT中....物理地址 可以分为:  RAM的地址和硬件寄存器的地址...
页框号 =  物理地址>> PAGE_SHIFT
如果 页框号 > MmHighestPossiblePhysicalPage  将表明这个地址是硬件寄存器的..
否则会以PageFrameIndex为INDEX检测MiPfnBitMap 的位设..如果位设为1..则表示该物理地址是RAM的物理地址,,,,
帖上一段.....硬件REG做为物理地址的...

//IO APIC使用重定向机制,我们不可以直接操作它的寄存器的,我们应该通过映射来完成
//IOREGSEL and IOWIN registers 位于IO APIC's base address的0x00和0x10偏移处.
//IO APIC's base address在NT中被映射到物理地址 0XFEC00000
//所以 IOREGSEL and IOWIN registers 的物理地址分别是 0XFEC00000,0XFEC00010
//访问他们的话只要用MmMapIoSpace()就可以了..
//如果系统不支持APIC...vector = 0x30+IRQ;      Sysnap 2009.5.22

BOOLEAN IsIoapicEnable()
{

BOOLEAN bis = FALSE;
__asm
{
   mov eax,1
   cpuid
   and edx, 0x00000200
   cmp edx,0
   jne __A
   mov bis,0
__A:
   mov ecx,0x1b
   rdmsr
   and eax,0x00000800
   cmp eax,0
   jne __B
   mov bis,0
   jmp __C
__B:
   mov bis,1
__C:

}
return bis;
}

DWORD IRQtoVector(DWORD dwIRQ)
{
PULONG lpIoapicMapBase = NULL;
DWORD dwVector = -1;
PHYSICAL_ADDRESS IoapicBase;     // i/o apic mapped pointer

if( IsIoapicEnable() == FALSE)
{
   dwVector = 0x30+dwIRQ;
   return dwVector;
}

IoapicBase = RtlConvertLongToLargeInteger(0xFEC00000);
lpIoapicMapBase = (PULONG)MmMapIoSpace(IoapicBase, 0xFF, MmNonCached);
if(lpIoapicMapBase == NULL || dwIRQ >23)
{
   //
   return -1;
}
// 把0x10 + 2 * dwIRQ 写到 IOREGSEL 寄存器
lpIoapicMapBase[0] = 0x10 + 2 * dwIRQ; // 0x10 + 2 * IRQ, Keyboard's irq is 1
// 接着可以读 IOWIN 寄存器
dwVector = lpIoapicMapBase[4] & 0xFF;
MmUnmapIoSpace(lpIoapicMapBase, 0xff);

return dwVector;
}

DbgPrint("--0x%x",IRQtoVector(12));
2009-6-13 11:31
0
雪    币: 97
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
谢谢指教,其实我也知道端口号可以映射成地址,不过没有深入研究过,我一直做上层的东西,对底层的实现细节不太清楚,什么时候写个驱动玩玩,呵呵。
2009-6-13 11:39
0
雪    币: 97
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
虚拟地址可以是端口寄存器的映射,好像和我的说法没有矛盾,但是我一般的确只考虑ram了。
2009-6-13 12:18
0
游客
登录 | 注册 方可回帖
返回
//