我确实试图了解Von Neumann架构,但有一点我无法理解,如果这个命令或者它是一个数据,用户如何知道计算机内存中的数字?
我知道有一个'存储程序概念',但我什么都不懂......
有人能用两句话向我解释一下吗?
thnx!
答案 0 :(得分:2)
简单地说,用户无法查看内存地址并确定它是命令还是数据。它可以是两者。
一切都在解释中;如果program counter指向内存地址,它将被解释为命令。如果它被读指令引用,则它是数据。
这一点是灵活性。程序可以将程序写入(或重写)到存储器中,然后可以通过将程序计数器设置为起始地址来执行。
现代操作系统通过data execution prevention限制此行为,从而使部分内存不被解释为命令。
答案 1 :(得分:1)
存储程序概念的基本概念是将数据和指令一起存储在主存储器中的想法。
答案 2 :(得分:0)
注意:这是一个过于简化的答案。为了说明这一点,我故意遗漏了很多事情
请记住,出于现代计算机上的所有意图和目的,所有计算机内存都是一长串字节。除非将放入的数字有特定的用途,否则数字是没有意义的。
我可以将数字5
放在地址0
上。它可以代表我的CPU指令集手册指定的第5条指令。它可以代表我上周的睡眠时间。除非为其分配了一些值,否则它是没有意义的。
那么计算机如何知道用数字实际“做什么” ?
这是标准和规范的大组合,标准或规范是文档或代码,用于指定应将哪些数据放在何处,每条数据意味着什么,该数据可接受的值是什么,等等。(通常)已达成此类标准群众。
标准无处不在。您的BIOS具有在引导媒体(您的硬盘,活动CD,可引导USB存储器等)上寻找主要操作系统入口点的规范。
从那里开始,操作系统遵循标准,该标准指示VGA缓冲区在内存中的位置(例如,在x86机器上为{0xb8000
),以便输出启动时看到的所有启动文本。机器。
依此类推。
可移植的可执行文件(Windows)或ELF映像(linux)或Mach-O映像(MacOS)只是遵循规范的文件,通常由操作系统制造商强制要求,该规范将代码段放置在特定位置在文件中。然后,在用户空间中指定了特定的virtual address的情况下,将该文件简单地加载到内存中,然后操作系统就会确切知道程序的入口点在何处。
从那里,它设置instruction pointer(IP)指向当前指令字节。在大多数CPU上,IP指向的当前字节会激活CPU中的特定电路以执行某些操作。
例如,在x86 CPU上,字节0x04
是ADD
instruction,它占用 next 字节(所以IP + 1
),将其读取为无符号8位数字,并将其添加到al
寄存器中。这是所有x86 CPU都同意实施的x86规范所要求的。
这意味着,当IP寄存器指向值为0x04
的字节时,它将执行IP的增加和增加2-首先是跳过ADD
指令本身,第二种是跳过“ {argument”(操作数)到ADD
指令。
IP的前进速度与CPU(和操作系统的调度程序)允许的速度一样快-相当于“正在运行”的程序。
数据的含义完全由创建数据和使用数据的方式定义。在最好的情况下,双方通常通过某种标准或规范达成协议。