恩,首先我对gdb不太熟,所以有问题请见谅哈~但是我在此有两个疑问:在 gdb 中运行时栈的地址总是从某处到 0xbfffffff,所以试验 1 段错误发生时确实是试图访问内核在进程虚拟内存空间的部分
1. 你判断栈地址是通过gdb来看的,而gdb给出的不是实际地址,因而0xbfffffff在实际地址中并不一定指向0xbfffffff,为何说是在尝试访问内核空间呢?
2. 据我所知用户进程与内核进程互相隔离且空间互相不可见,那么为什么说会“试图访问”呢。
你所进行的实验,包括验证程序试图访问内核空间的例子,其数据均来源于gdb。但是还是那个问题:gdb不会反映出数据在物理内存中的真实地址。
我可绝对没有这个意思啊,别误会而 4 楼的表述让我觉得很容易就看到其他进程的内存(不管看到是否意味着可以访问)
这个表述有可能不清楚,但正如我解释的,程序无法访问其他进程的内存空间,他仅仅是能够访问自己的“页空间”,包括自己的有效内存区域以及内部碎片部分。
其实我对这个机制也比较疑惑。照理说分页方式的虚拟内存-物理内存的映射与权限管理是完美的,但是“作弊器”这个名字貌似违反了这个概念。一个作弊器进程不是游戏进程的父进程,应该无法掌握游戏进程的信息啊,但是事实是却能够访问并修改游戏,这是为什么。。。另外我还是怀疑一个进程可以试图访问分配给另一个进程的物理内存。