现代 x64 系统上的指针内部是什么?
What is inside a pointer on a modern x64 system?
此代码例如:
int x = 75;
int *p = &x;
printf("%llx\n",p);
写入 64 位数字。我想问的是,这个数字到底是多少?是的,这是一个地址。
但它是存储值 75 的虚拟内存中的绝对地址吗?或者它可能与某个页面标记有偏移,或者与程序内存块的“起点”有偏移?
如果重要的话,我问的是 Windows 10、64 位,在典型的 x64 英特尔芯片上。
是的,就是你程序中的绝对地址virtual address space。
这不是偏移量。
在16位的Windows(30年前很普遍)中,使用了一个segmented memory model,其中指针被分段,由一个16位的段指针和一个16-位偏移量(共 32 位)。
但是,32 位和 64 位 Windows 都使用 flat memory model,它使用绝对地址。
它是一个虚拟地址,它是一个虚拟页号和从页首开始的偏移量。翻译机制在进程的页表中查找,以确定相应的物理页号,并将其与偏移量结合起来得出物理地址。
此代码例如:
int x = 75;
int *p = &x;
printf("%llx\n",p);
写入 64 位数字。我想问的是,这个数字到底是多少?是的,这是一个地址。
但它是存储值 75 的虚拟内存中的绝对地址吗?或者它可能与某个页面标记有偏移,或者与程序内存块的“起点”有偏移?
如果重要的话,我问的是 Windows 10、64 位,在典型的 x64 英特尔芯片上。
是的,就是你程序中的绝对地址virtual address space。
这不是偏移量。
在16位的Windows(30年前很普遍)中,使用了一个segmented memory model,其中指针被分段,由一个16位的段指针和一个16-位偏移量(共 32 位)。
但是,32 位和 64 位 Windows 都使用 flat memory model,它使用绝对地址。
它是一个虚拟地址,它是一个虚拟页号和从页首开始的偏移量。翻译机制在进程的页表中查找,以确定相应的物理页号,并将其与偏移量结合起来得出物理地址。