能力值:
( LV9,RANK:610 )
|
-
-
2 楼
内核空间的地址转换和用户空间是一样的,都是由cr3定位到PDE,在PDE中根据索引找PTE,再由PTE内容的pfn部分找到相应的页。只不过内核部分的地址空间是所有进程共享。你可以看看JIURL的玩玩Win2000内存系列,应该有帮助
|
能力值:
( LV9,RANK:610 )
|
-
-
3 楼
Linux下面貌似也是这样~
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
如果和用户空间的一样
转换的时候CR3是不是应该取System的DirBase还是其他的什么值?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
kd> !process 0 0 System
PROCESS 80e82830 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000
DirBase: 00039000 ObjectTable: e1000b78 HandleCount: 237.
Image: System
kd> !dd 00039000
# 39000 01840067 00000000 00000000 00000000
# 39010 00000000 00000000 00000000 00000000
# 39020 00000000 00000000 00000000 00000000
# 39030 00000000 00000000 00000000 00000000
# 39040 00000000 00000000 00000000 00000000
# 39050 00000000 00000000 00000000 00000000
# 39060 00000000 00000000 00000000 00000000
# 39070 00000000 00000000 00000000 00000000
可见页目录表中 只有一项 后面的都是0了
如果转换8055a700的话 dir=201 也是0
|
能力值:
( LV9,RANK:610 )
|
-
-
6 楼
看来你没理解进程上下文的概念。在哪个进程上下文中,就用哪个进程的页目录来寻址
|
能力值:
( LV9,RANK:610 )
|
-
-
7 楼
比如你WriteFile->KiSystemService->NtWriteFile,这时虽然已经到了内核中,但是还是处于WriteFile发起者的进程上下文中,所以要取当前进程的页目录来寻址,而页目录的位置在cr3中
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
谢谢你的回答
但是譬如有两个进程p1 p2
p1和p2都通过WriteFile->KiSystemService->NtWriteFile进入内核
p1的CR3=x p2的CR3=y (x != y)
那么对p1来讲内核空间的某个地址 如8055a700
页目录位于x[201]处 (201 = DirectoryOffset)
而对于p2进程来说 页目录位于y[201]
难道同一个内核地址被映射到两个不同物理地址?
|
能力值:
( LV9,RANK:610 )
|
-
-
9 楼
真正决定是哪一页的是pfn,PTE可以不同,但它的内容pfn可以是相同的。p1进程和p2进程看到的8055a700是相同的,因为内核部分的地址空间是所有进程共享,就好像ntdll,kernel32等knowndll一样也是所有进程共享。你可以分别切换到不同的进程空间然后执行!pte 8055a700看看PTE的内容pfn是不是一样的
|
能力值:
( LV9,RANK:610 )
|
-
-
10 楼
同一个物理页可以被映射到不同的地址,比如SharedUserData,MmSessionSpace都是这样,你可以观察一下他们映射的地址的PTE,pfn是一样的,但页属性可能不一样
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
eepo 是哪里的新手?
怎么这么熟悉?
|
|
|