首页
社区
课程
招聘
[旧帖] [求助]关于内存不能为read的问题 0.00雪花
发表于: 2012-1-31 21:32 1568

[旧帖] [求助]关于内存不能为read的问题 0.00雪花

2012-1-31 21:32
1568
使用指针访问高于2G的内存会报错
具体代码用vc6.0编译通过
#include <windows.h>
int main()
{
   byte *a=(byte *)0x80000000;
   if(*a)
    while(1);
}
会出现内存不能为read,但当我把0x80000000改成0x00000010也会蹦出来内存不能为read
为什么会出现这种情况啊!按理说指针指向的是一个小于2G的内存地址不会出现内存不能为read
百思不得其解啊!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如果你访问的是内核的内存空间呢?会让你随意读取么?
2012-1-31 23:04
0
雪    币: 31
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
每个进程有4吉独享地址空间,高2吉是操作系统的。低2吉的高和低64k(好像是这么多)也属于操作系统的。你3级进程任意读取数据?开玩笑吧。何况内存分页机制也不允许呀,每页4kb都有各自的属性。
2012-1-31 23:46
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
当然不会让我随意读取高于2G的内存空间,但是我读取低于2G的内存空间也会报错。
2012-2-1 10:27
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用户空间的代码ring3无法对ring0级的内存作任何操作,包括读操作,程序读取高于2G的内存空间就会报内存不能为read,但是我读取少于2G的内存也报错。
2012-2-1 10:31
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
不是任意地址都能访问的,在操作系统的分页机制层里,主要有两大限制:
1. 权限限制:某些virtual address地址的访问需要高权限
2. 缺页限制:不是所有的virtual address 都会映射到物理地址上,OS会有选择性的进行映射。
---------------------
所以,在程序中你不可能直接使用地址访问,这就靠“碰运气”,撞对了就可以访问。编译器和链接器知道OS映射到哪些区域,loader(加载器)会正确将程序加载应该放的地方。

你试着访问 0x00401000 附近的区域,应该可以访问
2012-2-1 10:46
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
如果是未分配的虚拟内存,估计就不行了
2012-2-1 11:06
0
游客
登录 | 注册 方可回帖
返回
//