关于debug的问题
在系统里运行debug之后,在里面修改或者跳转会不会影响计算机原有的内容啊,比如跳转到原先是是数据(把数据当成指令之后会怎样还是数据依然还是走的数据那部分的总线)的位置导致别的程序运行了,或者修改了之后计算机运行到这条改后的命令导致某个程序错误? 菜鸡认为,楼主所说的,是建立在多任务操作系统上的,(windows来说,Linux不知道是不是)那就有一个内存分页机制。通俗讲:32位系统,每个任务都分配了4G的地址空间,但是实际上并不会分配这么多(是的,系统欺骗了你),因为内存空间是大家共用的,所以你想在A程序Debug修改B的数据是不可能的(除非你让系统认为你是B)。如果你非要非法修改B的数据,系统应该会"xx数据只能为read"什么的。为什么你可以修改你所看到的所有4G的内存地址空间数据呢?我们看到的是线性地址,对应到物理地址就不一定到哪里去了。下图很好的说明了这一点:
如果你正在B中运行,觉得图中0x0012FF44是A的重要数据,修改它就可以让他死掉,所以修改过后 - - 其实还不知道修改到了哪里的数据,可能一点用都没有。
以上为n0noper个人理解,如有错误,请及时指正,共同提高。 n0noper 发表于 2016-3-3 10:46
菜鸡认为,楼主所说的,是建立在多任务操作系统上的,(windows来说,Linux不知道是不是)那就有一个内存分页 ...
多谢分析,刚想学学编程,不知道从哪开始就选了个汇编的,刚看了两章的视频,好多还不是太懂。你说的这个意思是不是就像视频里说的CPU与显示器是通过显卡间接的来控制的,所以每个任务有自己单独的地址,然后每个任务的地址段再虚拟出更大的一部分地址被前面的地址控制,debug的操作就是在这部分更大的地址里操作的,我能这样理解么。 烫嘴热粥 发表于 2016-3-3 22:42
多谢分析,刚想学学编程,不知道从哪开始就选了个汇编的,刚看了两章的视频,好多还不是太懂。你说的这个 ...
"每个任务的地址段再虚拟出更大的一部分地址被前面的地址控制"不是这么理解。
所有地址都是操作系统分配的,被操作系统控制。
这么理解:每个应用程序都拥有独立的4G的地址空间(32位操作系统前提下)。比如LOL打开了,
它自己可以利用的内存空间就有4G;这时候快播又打开了,操作系统也让他知道,他有4G的内存空间可以
使用。但是!你电脑配置一共就2G,咋整?这不是扯淡吗?哪来的那两个G?这个工作就交给操作系统,
他会忽悠LOL和快播说让他们尽情使用4G空间,而LOL和快播是不知道系统到底实际内存大小的。
这个时候,LOL说:我地图上要绘制大龙,要用到内存地址0x11111111。于是他写入了这个地址一堆数据;
快播又说:我搜到一个好种子,需要分配一个线程来下载,索要的地址是0x11111111,于是把0x11111111
写入了一堆0.难道他们两个就不能愉快的一起运行了?不,LOL的0x11111111地址对应物理内存地址可能
是0x00001111,快播对应的物理内存地址可能是0x00010000,这个得看系统怎么分配。
总结:操作系统启动应用程序时,只是把他们必要的部分先调入内存,其他数据在需要的时候再取。并且
每个应用程序使用的物理地址都是独立的,不可能重复。你Debug在正常权限下想修改其他应用程序的
内存数据?你都摸不到人家。这就很好的解释了,虽然他们都觉得自己有4G,但是物理内存实际才4G,不
可能达到唰唰的速度,如果一个LOL开起来之后,物理内存有3G分配给了他,只剩1G(忽略操作系统所需要)
内存给其他程序用,肯定慢死啊。 n0noper 发表于 2016-3-4 08:27
"每个任务的地址段再虚拟出更大的一部分地址被前面的地址控制"不是这么理解。
所有地址都 ...
也就是说各个任务要地址,系统是根据自己的定义按顺序进行分配物理地址的,不管它要的是什么地址。是不是debug运行时看到的是已经运行完的,再改也就没有什么意义了(除非赶上没运行完),必须在没运行前或给系统之前修改才能使真实修改的吧,所以在debug里改的地址数据一般不会造成其他后果。你也lol啊{:5_109:}。 烫嘴热粥 发表于 2016-3-4 22:18
也就是说各个任务要地址,系统是根据自己的定义按顺序进行分配物理地址的,不管它要的是什么地址。是不是 ...
并没有运行完,既然多任务系统,肯定牵扯时间片问题。你想修改,就得获取权限,这个就应该牵扯安全编程那边了吧?我就不是很了解了。
有好多东西并不一定要刚上来就弄懂,因为还没达到能完全理解的程度。让我们慢慢学吧,与君共勉! n0noper 发表于 2016-3-5 21:09
并没有运行完,既然多任务系统,肯定牵扯时间片问题。你想修改,就得获取权限,这个就应该牵扯安全编程那 ...
好的,谢谢了。
页:
[1]