能力值:
( LV7,RANK:100 )
|
-
-
2 楼
那也是虚拟内存啊,只是r3不能访问而已,建议你去看看分页机制。
保护模式下都是虚拟线性地址,几句话说不清楚,查资料吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
映射到相同物理内存不是很节省资源吗,反正r3不能访问,干脆锁死0x7FFFFFFF以上的也行啊,微软是怎么想的?
|
能力值:
( LV7,RANK:100 )
|
-
-
4 楼
你所说的大体意思上是对的,上次回复的时候没有想太多,不好意思
每个进程虚拟内存的0x7FFFFFFF-0xFFFFFFFF地址是映射到相同的物理内存吗?
答:是,共用一份页表(个人猜测)。
而且低2GB内存并带有CopyOnWrite属性的页同样映射到相同的物理内存。
这块内存有什么映射约定?
答:没看懂,不知道你要问什么。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
这块内存在内存管理器的初始化阶段被建立,具体映射规则在内核中的MiGetPteAddress宏中可能有提到。(见潘爱民大神的《Windows内核原理与实现》)
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
0x7FFFFFFF-0xFFFFFFFF既然是共享的,为什么我用调试器修改一个进程系统地址里的内存比如说kernel32.dll里的一个api,其他进程的该api没变化?
难道进程的高2GB虚拟地址也需要每个进程都备份吗?
|
能力值:
( LV8,RANK:130 )
|
-
-
7 楼
kernel32不在高位地址
|
能力值:
( LV8,RANK:130 )
|
-
-
8 楼
高位地址,共享的,任何进城均可修改,访问,但r3无权限,只要r0,用权限,r0代码可以在低位地址运行
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我修改一个进程A的高2GB内存,另一个进程B同样地址的内存并没有改变啊?
|
能力值:
( LV7,RANK:100 )
|
-
-
10 楼
这个问题我遇到过,在内核态中不容易修改,因为kernel32的页带有CopyOnWrite属性,如果你修改成功,只会有两种情况:
1.触发了CopyOnWrite。2.修改了全局内存。
而你的结果很显然触发了CopyOnWrite,系统为你重新映射了一份内存,保护了全局的kernel32镜像内存。
另外,kernel32.dll的线性地址很显然在低地址,不属于内核态空间。
虽然有的地址是0x7F开头,但也是低位地址,只有地址大于0x80000000的才是内核空间内存,即二进制最高位是不是1代表了地址是否为内核空间。
|
能力值:
( LV7,RANK:100 )
|
-
-
11 楼
内核态内存,也就是高位地址确实是唯一共享的,你的实验方法不对。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
看过 window核心编程 不过里面也没有lz的答案 哦
|
能力值:
( LV8,RANK:130 )
|
-
-
13 楼
这个,内核空间不是以2G区分的哈,你找找资料,
准确的说,是内核空间共享,内核空间只有一个,如果你修改掉了,其它进程所访问到的内核空间,不可能说没有改变
|
能力值:
( LV17,RANK:797 )
|
-
-
14 楼
好像是 0x80000000 开始的是内核,kernel32、ntdll.dll不在内核里。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
非常感谢你的耐心,也很详细。其他人也一并感谢,kernerl32确实在应用层,我看错了,之前对这个问题一直没想明白。
|
|
|