2010-12-14 112 views

回答

0

当您启动应用程序时,eip(程序计数器)被设置为您的程序的文本数据所在的位置,文本数据就是您的代码(0..1)。从这里开始执行来自eip上的地址的指令。这些指令是在cpu(或缓存)附近的ROM上定义的,如果cpu试图执行某个不是指令的东西,它会引发异常(此级别的中断)。他如何知道它是否是指令,想象得到的foreach指令会检查ROM和散列表以查看它是否是有效的指令。

这是一个非常简单的问题,因为很多事情都发生在XDD上。

3

处理器只做你告诉它做的事情。正如你所说的,处理器无法区分内存中“数据”和“代码”之间的区别:它只是一个字节序列。这就是你告诉它如何处理那些定义它如何处理的字节。

编译程序时,生成的可执行文件中包含有关于哪些部分是代码以及哪些部分是数据的信息。当程序执行时,操作系统将代码和数据加载到内存的不同部分,然后告诉处理器在程序的入口点开始执行代码。从那里,处理器取出第一条指令,执行它,然后转到下一条指令。

当然,这一切都非常简单,但我认为你明白了。

在较旧的处理器和较旧的操作系统中,没有任何东西阻止您告知处理器开始执行位于数据段中间的指令。或者,实际上,可以通过修改代码段中的“数据”来实现自修改代码。较新的处理器和操作系统通常具有某种形式的数据执行预防和锁定以防止修改代码。否则,自修改代码会成为一个巨大的安全风险。

简短回答:处理器会将代码视为代码,因为您告诉代码。否则,一切都只是内存中的字节。

2

各种寄存器帮助处理器区分在计算机上执行的进程中的各种内存段。当程序启动时,代码段寄存器(cs)和指令指针(ip/eip/rip)被设置为指向代码的位置,而数据段寄存器(DS)和其中一个通用寄存器(通常是DX )被用来指向数据段。那么主要是Intel x86架构,但总的来说,大多数架构都有寄存器来区分数据区的代码区和堆栈段。通过这些寄存器,CPU可以“知道”或能够在单个答案中区分代码地址