能力值:
(RANK:410 )
2 楼
能力值:
( LV13,RANK:970 )
3 楼
物理地址是唯一的,虚拟地址可以都一样.内存里面的东西也是通过硬盘上的程序弄出来的,所以内存的东西可以看作临时的,就不用太多考虑了.找硬盘的东西的时候先用虚拟地址根据段、页等,找到具体在硬盘上什么磁道。
就是说虚拟地址的计算不依赖于物理地址。
能力值:
( LV12,RANK:660 )
4 楼
能力值:
( LV9,RANK:1410 )
5 楼
最初由 prince 发布 楼主不是这个意思. 这个问题也困扰了我很久,或许看看<<Undocumented Windows 2000>>会有帮助.
我的意思不是上面的老兄所讲的,我的问题其实很简单:CPU在从硬盘读入到内存的时候,是否使用虚拟地址寻址,如果使用的话,怎么确定的代码段等各段的地址的?因为在PE头部有这个地址信息,可是在没有读进内存之前,CPU怎么知道的?难道读取的PE头部信息直接送CPU内部缓存,然后找出各段的起始地址,然后就可以根据这个信息继续读取剩余的代码到内存了。这样CPU就可以使用虚拟地址往内存写入数据了,跟读取数据的时候过程是一样的。我的猜测是这样的,不知是否正确?希望高手指点迷津!!感谢!
我的这个问题,其实在所有的讲解X86模式的参考书里面都没有讲到这个问题,我的问题是普遍问题,我猜好多人根本不懂,当然不懂也没有关系的,不妨碍破解等。但是我希望搞明白这个问题。我是喜欢钻研的人,喜欢深究!
感谢各位!
能力值:
( LV2,RANK:10 )
6 楼
加载程序是操作系统干的事吧
操作系统根据PE头信息建立段表项,页表项
加载一部分程序到内存中,另一部分在虚拟内存中(硬盘)
真正程序运行在cache中,cache中代码更少了
cpu只管根据虚拟地址访问,
如果需要的代码未加载,就会产生缺页中断,
中断处理程序把内存中一部分暂时不用的代码替换出去,把需要用到的为加载的代码替换近来,具体顺序是 cache <==> 内存 <==> 虚拟内存(硬盘)
由硬件转换成物理地址,
执行用户程序就是任务切换,可以通过TSS实现,也可以不用TSS实现,
只要有了加载信息,就和进程调度差不多了吧
个人理解,错误之处还请指出
能力值:
( LV9,RANK:1410 )
7 楼
加载程序是操作系统干的事吧
操作系统根据PE头信息建立段表项,页表项
加载一部分程序到内存中,另一部分在虚拟内存中(硬盘)
真正程序运行在cache中,cache中代码更少了
cpu只管根据虚拟地址访问,
如果需要的代码未加载,就会产生缺页中断,
中断处理程序把内存中一部分暂时不用的代码替换出去,把需要用到的为加载的代码替换近来,具体顺序是 cache <==> 内存 <==> 虚拟内存(硬盘)
由硬件转换成物理地址,
执行用户程序就是任务切换,可以通过TSS实现,也可以不用TSS实现,
只要有了加载信息,就和进程调度差不多了吧
----------------------------------------------------------
你回答的问题好像比较离题了,过于搪塞了。没有切中我问题的实质。
操作系统怎么根据PE头信息建立段表项,页表项,起码CPU要读取硬盘上的PE信息,然后写入内存吧?那么怎么写入内存呢?怎么形成内存地址呢?因为在CPU没有得到PE信息之前他把内容写到哪里去?
能力值:
( LV4,RANK:50 )
8 楼
读PE头是其中系统某进程的事,当它调用CreateProcess时是Kernel32.dll在该进程中创建临时空间并读取PE头.
再根据PE头的信息,向ring0级的ntoskrnl申请一个4G的段,
再用类似WriteProcessMemory的方法从磁盘上的PE文件映象到新建进程空间的内存中.
然后处理各个表,最后开始创建线程从入口开始执行.
能力值:
( LV8,RANK:130 )
9 楼
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
;Written by Four-F (four-f@mail.ru)
;
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; GetPhysicalAddress
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
GetPhysicalAddress proc dwAddress:DWORD
; Converts virtual address in dwAddress to corresponding physical address
mov eax, dwAddress
mov ecx, eax
shr eax, 22 ; (Address >> 22) => Page Directory Index, PDI
shl eax, 2 ; * sizeof PDE = PDE offset
mov eax, [0C0300000h][eax] ; [Page Directory Base + PDE offset]
.if ( eax & (mask pde4kValid) ) ; .if ( eax & 01y )
; PDE is valid
.if !( eax & (mask pde4kLargePage) ) ; .if ( eax & 010000000y )
; small page (4kB)
mov eax, ecx
; (Address >> 12) * sizeof PTE => PTE offset
shr eax, 10
and eax, 1111111111111111111100y
add eax, 0C0000000h ; add Page Table Array Base
mov eax, [eax] ; fetch PTE
.if eax & (mask pteValid) ; .if ( eax & 01y )
; PTE is valid
and eax, mask ptePageFrameNumber ; mask PFN (and eax, 11111111111111111111000000000000y)
; We actually don't need these two lines
; because of module base is always page aligned
and ecx, 00000000000000000000111111111111y ; Byte Index
add eax, ecx ; add byte offset to physical address
.else
xor eax, eax ; error
.endif
.else
; large page (4mB)
and eax, mask pde4mPageFrameNumber ; mask PFN (and eax, 11111111110000000000000000000000y)
and ecx, 00000000001111111111111111111111y ; Byte Index
add eax, ecx ; add byte offset to physical address
.endif
.else
xor eax, eax ; error
.endif
ret
GetPhysicalAddress endp
能力值:
( LV6,RANK:90 )
10 楼
这和操作系统的存储管理机制有关。微软的做法是让软件中涉及的内存(块)等物理概念越来越远离人们的视线,取而代之的都是虚拟的东西。
能力值:
( LV2,RANK:10 )
11 楼
这是操作系统的事,去看看操作系统原理就知道怎么回事了。内存管理方面
能力值:
( LV2,RANK:10 )
12 楼
先去看看PE格式吧
里面有几个参数
是PE加载器要用到的
虚拟地址上的都是软件方面的东西
你问得大多和操作系统有关
能力值:
( LV2,RANK:10 )
13 楼
斑竹写的问题好象在操作系统中有讲到吧
在计算机运行中,硬盘上有文件分区表,内存中也有类似的表, 在表中写着内存的分区情况和那些区是空闲的,那些是占用的
从硬盘上读入文件时,系统首先访问硬盘分区表,找到这个文件的文件分区表,看看有多少段,每个段在硬盘的位置,然后开始掉入内存分区表中标示为空闲的内存段