内存可以随意访问?

软件和网站开发以及相关技术探讨
头像
qgymib
帖子: 539
注册时间: 2010-04-02 16:44
系统: openSUSE 13.2 x64

Re: 内存可以随意访问?

#16

帖子 qgymib » 2014-05-01 18:06

在 gdb 中运行时栈的地址总是从某处到 0xbfffffff,所以试验 1 段错误发生时确实是试图访问内核在进程虚拟内存空间的部分
恩,首先我对gdb不太熟,所以有问题请见谅哈~但是我在此有两个疑问:
1. 你判断栈地址是通过gdb来看的,而gdb给出的不是实际地址,因而0xbfffffff在实际地址中并不一定指向0xbfffffff,为何说是在尝试访问内核空间呢?
2. 据我所知用户进程与内核进程互相隔离且空间互相不可见,那么为什么说会“试图访问”呢。

你所进行的实验,包括验证程序试图访问内核空间的例子,其数据均来源于gdb。但是还是那个问题:gdb不会反映出数据在物理内存中的真实地址。
而 4 楼的表述让我觉得很容易就看到其他进程的内存(不管看到是否意味着可以访问)
我可绝对没有这个意思啊,别误会 :em20
这个表述有可能不清楚,但正如我解释的,程序无法访问其他进程的内存空间,他仅仅是能够访问自己的“页空间”,包括自己的有效内存区域以及内部碎片部分。
另外我还是怀疑一个进程可以试图访问分配给另一个进程的物理内存。
其实我对这个机制也比较疑惑。照理说分页方式的虚拟内存-物理内存的映射与权限管理是完美的,但是“作弊器”这个名字貌似违反了这个概念。一个作弊器进程不是游戏进程的父进程,应该无法掌握游戏进程的信息啊,但是事实是却能够访问并修改游戏,这是为什么。。。
正在建设中的个人博客
头像
qgymib
帖子: 539
注册时间: 2010-04-02 16:44
系统: openSUSE 13.2 x64

Re: 内存可以随意访问?

#17

帖子 qgymib » 2014-05-01 18:20

随意一找竟然发现了访问其他程序内存区域的函数(win32) :em05
http://bbs.csdn.net/topics/40128989
好吧这种应该属于不正常的系统调用。不知道linux下有没有这种函数 :em20
正在建设中的个人博客
头像
royclark
帖子: 301
注册时间: 2011-05-15 1:01
系统: Debian GNU/Linux sid

Re: 内存可以随意访问?

#18

帖子 royclark » 2014-05-01 20:13

我看到到处都说 32 位 Linux 里进程虚拟内存 0xc0000000-0xffffffff 总是映射到内核的内存,且对于每个进程都相同,但是用户空间进程无法访问。也许这里可以作为可靠的资料。至于内核的实际物理内存在哪并不影响,因为 0xc0000000 之后总是对应于内核的。
这里有几张图,比较好理解,虽然都是 Windows 的,但 Linux 基本上也类似。
图片
图片
在虚拟内存里有一部分总是指向内核的物理内存,有一部分自动分配和进程申请的指向属于进程的物理内存,剩下一些“洞”哪里都不指。
除了那些洞,虚拟地址总是可以对应物理地址,所以不用关心实际的物理地址应该也可以的。
(这里“可以对应物理地址”并不一定实际映射了,如果访问时还没有映射会通过缺页异常进行分配和映射。)
头像
royclark
帖子: 301
注册时间: 2011-05-15 1:01
系统: Debian GNU/Linux sid

Re: 内存可以随意访问?

#19

帖子 royclark » 2014-05-01 20:15

而 4 楼的表述让我觉得很容易就看到其他进程的内存(不管看到是否意味着可以访问)
我可绝对没有这个意思啊,别误会 :em20
这个表述有可能不清楚,但正如我解释的,程序无法访问其他进程的内存空间,他仅仅是能够访问自己的“页空间”,包括自己的有效内存区域以及内部碎片部分。
我觉得可以有两种理解。一种是存在某个虚拟地址,比如 int *p = 0xaa,它可以对应到其他进程的物理地址,0xcc。*p = 3 则相当于把物理内存 0xcc 赋值为 3。但 0xcc 已经分给另一个进程,所以会发生段错误。
另一种理解是,不存在这种虚拟地址,也就是在上面第一幅图里,永远不会有箭头指向红色的地方。也就是在 0xcc 已经分给另一个进程的情况下,无论 p 怎么取,*p = 3 都不会把物理内存 0xcc 赋值为 3。
前一种是想要赋值,但失败了;后一种连想都做不到,因为虚拟地址没有一个是与 0xcc 对应的。
这样说可以理解我的意思吗?我觉得你是指第一种理解,而我觉得实际上应该是后一种理解。用用户空间的工具可能无法判断是哪种情况,估计要看内核源码了。

要是你是指后一种,那就是我没理解你的意思,也就没事了。
头像
royclark
帖子: 301
注册时间: 2011-05-15 1:01
系统: Debian GNU/Linux sid

Re: 内存可以随意访问?

#20

帖子 royclark » 2014-05-01 20:18

qgymib 写了:随意一找竟然发现了访问其他程序内存区域的函数(win32) :em05
http://bbs.csdn.net/topics/40128989
好吧这种应该属于不正常的系统调用。不知道linux下有没有这种函数 :em20
Linux 应该也有允许访问其他进程内存的系统调用吧。
另外 /dev/mem 是物理内存的镜像,有根限的话就可直接读与物理内存,读写某个进程的内存也就有可能。
头像
qgymib
帖子: 539
注册时间: 2010-04-02 16:44
系统: openSUSE 13.2 x64

Re: 内存可以随意访问?

#21

帖子 qgymib » 2014-05-01 20:45

The lower 896 MB, from 0xC0000000 to 0xF7FFFFFF, is directly mapped to the kernel physical address space
原来如此,学习了,以前一直以为整一个虚拟空间都是通过映射关系与物理内存建立连接的。不过这个不能访问是不是仅针对于处于用户空间的进程,而处于内核空间的进程可以访问?
我觉得可以有两种理解。
在lz这个问题以及在我上面提出的解释中,是你所说的第二种理解。第一种理解应该仅适用于操作系统启动分页管理器之前运行的进程吧?
正在建设中的个人博客
回复