我确实试图理解冯诺依曼架构,但有一点我无法理解,如果这个命令或者它是一个数据,用户如何知道计算机内存中的数字?
我知道有一个“存储程序概念”,但我什么都不懂……
有人可以用两句话向我解释吗?
谢谢!
我确实试图理解冯诺依曼架构,但有一点我无法理解,如果这个命令或者它是一个数据,用户如何知道计算机内存中的数字?
我知道有一个“存储程序概念”,但我什么都不懂……
有人可以用两句话向我解释吗?
谢谢!
存储程序概念的基本概念是将数据和指令一起存储在主存储器中的想法。
注意:这是一个过于简单化的答案。为了说明问题,我故意遗漏了很多东西
请记住,就现代机器的所有意图和目的而言,所有计算机内存都是一长串字节。这些数字是没有意义的,除非把它们放在那里的东西对它们有特定的目的。
我可以把号码5
放在地址0
。它可以代表我的 CPU 指令集手册中指定的第 5 条指令。它可以代表我上周的睡眠小时数。除非它被赋予了一些价值,否则它是没有意义的。
那么计算机是如何知道实际对这些数字“做什么”的呢?
它是标准和规范的大量组合,它们是指定哪些数据应该去哪里、每条数据意味着什么、数据的可接受值是什么等的文档或代码。这些标准(通常)得到大众的认可.
标准无处不在。您的 BIOS 有关于在引导介质(您的硬盘、Live CD、可引导 USB 记忆棒等)上查找主要操作系统入口点的位置的规范。
从那里开始,操作系统遵循规定 VGA 缓冲区存在于内存中的位置(0xb8000
例如在 x86 机器上)的标准,以便输出您在启动机器时看到的所有启动文本。
等等等等。
可移植可执行文件(windows)或 ELF 映像(linux)或 Mach-O 映像(MacOS)只是遵循规范的文件,通常由操作系统制造商强制要求,将代码片段放在文件中的特定位置. 然后将该文件简单地加载到内存中,给定用户空间中的特定虚拟地址,然后操作系统确切地知道程序的入口点在哪里。
从那里,它将指令指针(IP) 设置为指向当前指令字节。在大多数 CPU 上,IP 指向的当前字节会激活 CPU 中的特定电路以执行某些操作。
例如,在 x86 CPU 上,字节0x04
是获取下一个字节 (so ) 的ADD
指令,将其作为无符号 8 位数字读取,并将其添加到寄存器中。这是 x86 规范的强制要求,所有 x86 CPU 都同意实施该规范。IP + 1
al
这意味着当 IP 寄存器指向值为 的字节时0x04
,它将执行加法并将 IP 增加 2 - 第一个是跳过ADD
指令本身,第二个是跳过“参数”(操作数)到ADD
指令。
IP 的发展速度与 CPU(和操作系统的调度程序)允许的速度一样快——这相当于一个“正在运行”的程序。
数据的含义完全由创建数据的对象和使用数据的对象来定义。在最好的情况下,双方通常通过某种标准或规范达成一致。