繁体   English   中英

CPU如何知道内存中的数据是数据还是命令? (C程序设计)

[英]how does the cpu knows that the data in memory is data or a command? (C programming)

我希望数据从例如0x100(内存位置)开始,而在此之前的所有内容都是命令...但是我真的不确定! 感谢帮助!

好吧,详细说明我的问题:我将内存看成一个带有一个字节空间的长数组。 该空间充满了十六进制数字。 但是变量可以填充例如0x0000-0xffff的内存。 但是,您怎么知道例如0x002f是命令(例如'mov')还是只是数字作为数据?

通常,CPU不知道。 它只是执行指令。 但是,带有帮助或内存管理单元的操作系统可能会将某些内存页标记为可执行或不可执行,从而阻止了CPU执行该页。

CPU如何知道内存中的数据是数据还是命令?

它仅从上下文中知道-您可以(保留现代CPU的执行保护)很好地将指令指针设置为数据块,然后让CPU执行它(很可能产生无用的结果)。 反之亦然:当一条指令正在访问一个内存位置时,它被视为要使用的数据-但它甚至可能是代码内存的一部分(读取CPU指令的操作码)。

因此,从本质上讲,数据存储和代码存储之间没有区别,至少在根据von-Neumann架构构建的CPU上没有区别。

另一方面,也有根据哈佛体系结构构建的CPU(例如PIC微控制器系列)-在这些系统上,由于访问路径在物理上是分开的,因此无法将数据视为代码或将代码视为数据。

我希望数据从例如0x100开始

这取决于CPU和操作系统。 您可能是指来自MS-DOS( 代码从0x100开始)的古老.COM文件或某些其他体系结构。 在现代操作系统上,通常涉及虚拟内存管理。

CPU不知道。 这都是关于约定的。

当您启动计算机或嵌入式设备时,它会开始从闪存执行Bootloaer。

反过来,引导加载程序会将持久性存储区中的启动代码加载到内存中,并在其加载地址处开始执行(通常是OS内核)。

反过来,内核将在已知的内存位置加载其他模块和初始化代码,然后从那里执行。

在某个时候,启用了内存虚拟化,并将可执行文件加载到内存中,并且每个可执行文件都与一个进程及其地址空间相关联。 可执行标头和OS约定定义代码和数据段的位置。

但是代码段可能包含嵌入式数据,而动态分配的内存可能包含代码,例如在即时编译器或恶意程序中。

可以说明一下:假设正在运行的编译器的地址空间...

[ code seg from .exe ] [ data seg from .exe ] [ dynamic alloc ]

这些内存区域之间的唯一区别是,[代码]是Read + Execut,[数据]是ReadOnly,[动态]是Read + Write,有时+ Execute

  • [代码]包含
    • 主要是机器指令
    • 但它可能包含立即数据,例如整数常量等
  • [数据]包含
    • 诸如您的语言关键字字符串,错误消息等之类的内容。
    • 代码,因为您有机器指令字典,因此可以生成代码
  • [动态]包含
    • 运行时分配的数据结构,例如字符串,树等。
    • 运行时生成的代码,它将被写入编译器正在构建的exe
    • 运行时生成的代码,将由jit执行以在编译时计算复杂表达式

如此看来,您可以在任何部分中包含数据和代码。 这就是使计算机功能强大的原因,另请参见图灵机

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM