我真的试图理解冯·诺依曼的体系结构,但有一件事我不能理解,如果这条命令或它是一个数据,用户如何知道计算机内存中的数字?
我知道有一个“存储程序的概念”,但我什么都不懂……
有人能用两句话给我解释一下吗?
太好了!
发布于 2011-03-29 02:37:47
简而言之,用户不能查看存储器地址并确定它是命令还是数据。可以两者兼而有之。
这一切都在解释中;如果program counter指向一个内存地址,它将被解释为命令。如果它被读指令引用,那么它就是数据。
这样做的重点是灵活性。程序可以将程序写入(或重写)到存储器中,然后可以通过将程序计数器设置为起始地址来执行这些程序。
现代操作系统通过data execution prevention限制这种行为,防止部分内存被解释为命令。
发布于 2019-11-05 14:43:55
存储程序概念的基本概念是将数据和指令一起存储在主存储器中的思想。
发布于 2019-11-05 15:07:56
注:这是一个过于简单化的答案。为了说明这一点,我故意省略了很多东西。
请记住,在现代机器上,所有计算机内存都是一个很长的字节列表。这些数字没有意义,除非把它们放在那里的东西对它们有特定的目的。
我可以把号码5写在地址0上。它可以代表我的CPU的指令集手册中指定的第五条指令。它可以代表我上周的睡眠小时数。除非它被赋值,否则它是没有意义的。
那么计算机如何知道如何实际“处理”这些数字呢?
它是标准和规范的大量组合,这些文档或代码指定了哪些数据应该放在哪里,每个数据意味着什么,数据的可接受值是什么,等等。这样的标准(通常)是由大众达成一致的。
标准无处不在。您的BIOS指定了在引导介质(硬盘、live CD、可引导U盘等)上查找主操作系统入口点的位置。
在此基础上,操作系统遵循指定内存中VGA缓冲区所在位置的标准(例如,x86机器上的0xb8000),以便输出您在启动机器时看到的所有启动文本。

以此类推。
可移植的可执行文件(windows)、ELF映像(linux)或Mach-O映像(MacOS)也是遵循规范的文件,这些规范通常由操作系统制造商强制执行,将代码段放在文件中的特定位置。然后,该文件被简单地加载到内存中,给定用户空间中的特定virtual address,然后操作系统确切地知道您的程序的入口点在哪里。
从那里,它将instruction pointer (IP)设置为指向当前指令字节。在大多数CPU上,IP指向的当前字节激活CPU中的特定电路以执行某些操作。
例如,在x86 CPU上,字节0x04是获取下一个字节的ADD instruction (因此为IP + 1),将其作为无符号8位数字读取,并将其添加到al寄存器。这是所有x86 CPU都同意实现的x86规范所要求的。
这意味着当IP寄存器指向一个值为0x04的字节时,它将执行加法并将IP加2-第一个是跳过ADD指令本身,第二个是跳过ADD指令的“参数”(操作数)。
IP的速度与CPU (和操作系统的调度程序)允许的速度一样快--这相当于一个“运行”的程序。
数据的含义完全由创建数据的内容和使用数据的内容定义。在最好的情况下,双方通常通过某种标准或规范达成一致。
https://stackoverflow.com/questions/5463022
复制相似问题