来自程序的指令如何发送到不同的内存级别?首次制造芯片时是否已预加载?

How do instructions from a program get sent to different memory levels? Are they pre-loaded when the chips are manufactured for the first time?

我现在的问题是,编译器将程序执行所需的指令移动到内存中的方式与数据推送的方式相同吗?

如果第一个问题的答案是肯定的,那么 CPU 设计人员在 cache/main 刚从代工厂出来的内存中加载什么?由于芯片上从未有过 运行 程序,因此在设计和制造芯片时是否将任何指令预加载到内存中,以便在芯片上电时执行一组预定义的序列第一次?

How do instructions from a program get sent to different memory levels?

处理器使用程序计数器将它们拉入缓存,也就是指代下一条要执行的指令的指令指针。

Are they pre-loaded when the chips are manufactured for the first time?

不适用于通用程序。只有特殊的环境才能将程序烧录到永久存储器中,例如 ROM,这可能发生在启动计算机或嵌入式系统时。通用程序依赖操作系统将其代码和数据与内存相关联。

My question now is, do instructions required for program execution get moved to memory by the compiler the same way data gets pushed?

回顾:编译器遵循(源)代码程序的语句和表达式,将它们翻译成机器代码指令和数据;这些机器代码指令指示处理器如何执行高级语言程序。这包括将数据加载到 CPU 寄存器的机器代码指令,有时这样数据更接近 CPU 以便更快地使用,其他时候因为这是 [=48= 的唯一方法] 可以对数据进行操作(通过处理器的机器码指令集)。

内存中的机器代码指令和处理器中的机器代码指令是有区别的。

编译器本身并不命令将指令移入处理器。处理器是机器代码指令的解释器,它会自行将指令拉入自身执行。编译器布置指令序列,CPU 自动将它们引入执行——这就是 CPU 的目的。

程序代码 (取模现代缓存) 太大,无法直接加载到 CPU。因此,程序存储在主内存中,就像数据太大而无法直接放入CPU。程序代码是机器代码指令的序列。由于这些指令存储在内存中,因此每个单独的指令都有一个唯一的内存地址!处理器通过它们的内存地址引用指令,并且通过它们的内存地址有一个概念,即现在正在执行什么指令以及接下来要执行什么will/should。

指令指针寄存器(在intel-speak中)或程序计数器寄存器(几乎所有其他机器代码语言)的机制,但概念是相同的:有一个基本寄存器在处理器内部,它的工作是保存现在正在执行的机器代码指令的地址,它的工作也是改变以指示下一个要执行的指令。

如前所述,处理器是机器代码指令的解释器。它以所谓的 fetch-execute 模式使用其内部程序计数器,它要求内存系统提供下一个要执行的机器代码指令的值。该需求,即读取某个特定内存地址的请求,可能会导致缓存未命中或页面错误(或两者),最终,通过处理器和操作系统的共同作用,将导致机器代码指令加载到内存中,加载到缓存,加载到处理器本身。

程序的每条机器码指令都通知处理器接下来要执行什么机器码指令。该程序可以将程序计数器向后移动到 re-execute 已经执行的指令(形成循环)或将其向前移动以退出循环或跳过 then 或 else 语句。处理器和机器代码之间存在协作,处理器在每一步都被告知下一步要执行什么机器代码。因此,机器代码程序正在指导机器代码程序序列的执行,但实际执行的是处理器(尽管在程序的指导下)。

我们会说编译器告诉处理器加载要执行的指令到 CPU 中吗?有点,但不像将数据加载到 CPU.

的命令那样明确

编译器在用于控制执行的机器代码程序中创建一个序列,所以我会说它隐含地告诉处理器将哪些指令带入缓存。否则(模内存映射和页面错误)机器代码指令已经在内存中(通过操作系统将内存与程序代码和数据相关联),处理器将管理缓存以保持在更高级别频繁执行的指令缓存。

what do CPU designers load into the cache/main memory when it comes fresh out of the foundry?

没什么,内存被认为是空白的,可以重新利用。在某些系统上,我们甚至不能保证处理器启动时每个存​​储单元的值。如果程序(作为光盘上的文件)为内存指定了正确的初始值,那么内存中的原始值(来自启动或其他程序的执行)将替换为这些指定值。程序使用的其他内存在使用前清零。

are any instructions preloaded into memory at the time of designing and manufacturing of the chip so that it executes a pre-defined set of sequences when it is powered up for the first time?

是的,有时一些记忆 hard-coded 包含有助于计算机启动的代码和数据。这不是将军l 编程的目的方式 运行.

我认为您正在尝试 over-complicate 这个。你的问题当然很宽泛,有不同的解决方案。

微控制器、MCU 往往具有某种形式的非易失性存储,今天这意味着闪存。对于每个 brand/family/product,都有一些方法可以使用部件的引脚以某种方式对闪存进行编程。机器代码、program/instructions 以及数据都可以被编程到这个闪存中。然后在正常启动时,mcu 中的处理器将开始执行这些指令和 运行 应用程序。

普通处理器,或者说 non-mcus,通常没有片上 non-volatile 存储。通常会有某种形式的片外 non-volatile 存储,可以是闪存、SD 卡接口等。该存储将包含机器代码等,用于启动芯片并使其运行。

一些处理器有片上 sram 和一些接口,可以通过芯片上的接口进入以停止处理器,用指令加载内存并开始执行这些指令。有些人可能会以 reset/boot 上的逻辑将指令从 sd 卡复制到此 sram,然后启动从该 sram 执行的处理器的方式使用此 sram。

没有一种方法可以让每个处理器都启动。

例如,一旦 运行 运行一个操作系统,操作系统就可以将硬盘上的程序加载到内存中,然后跳转到该代码即可启动它 运行 运行。

cache 只是缓存,它位于处理器和主内存之间(对于 Linux/Windows/MacOS 类型的系统通常是 dram)。您通常有一个 MMU,内存管理单元,由软件(kernel/operating 系统)配置以描述系统并定义地址 space 的哪些部分将被缓存以及以何种方式(指令,数据等)。然后,当处理器发生内存事务并通过 mmu 时,会将事务标记为可缓存或不可缓存,然后缓存(如果已配置和启用)将....缓存该事务...您不填写直接缓存,缓存基本上是自动的,并且基于正在发生的事务,通常是不可预测的。

已经有处理器芯片设计,出于各种原因,具有由芯片制造商编程的片上 ROM 或闪存。这可用于驱动 CISC 设计的微代码,这可以是 MCU 的工厂引导加载程序,或其他原因。

内存,DRAM,是动态D,你不仅要为它保留任何信息而努力,它是易失性的,当电源关闭,或刷新停止时,它会丢失它的信息。您绝对不会在某些工厂对此进行预编程。

SRAM 也一样。

除了一些非常罕见的情况外,逻辑的设计使其从某些 non-volatile 存储(现在是某种形式的片上或片外闪存设备)启动。 non-volatile 存储通常由产品供应商(而非芯片供应商)、计算机主板、电视机顶盒、电池 phone 等进行编程。该代码通常会在另一个 non-volatile 某种存储(硬盘、SSD 等)。当然,该软件可能是一个操作系统,然后可以 运行 其他各种应用程序(网络浏览器、邮件程序、游戏等)。您通常有一种解决方案来启动芯片、初始化 dram 等,以准备加载系统和 运行 从某些介质上关闭操作系统,这与引导加载程序不同并不罕见。然后操作系统加载 运行s 应用程序,通常来自与操作系统相同的介质。

这辆车是通用的。用户必须插入一个钥匙并打开它并启动它。然后用户必须把它开到某个地方。事物完成其工作的多个步骤。汽车的设计使得驾驶员不会 pre-built 进入汽车,而是一个通用界面,使得无数不同的操作员可以启动和驾驶汽车。

与processor/system相同,重置启动引导加载程序,引导加载程序加载操作系统,操作系统加载应用程序。软件存储在一种或多种形式的非易失性存储器中,并通过设计到硬件(芯片或电路板)中的通用接口加载。

RAM,包括缓存层,根据某些设计只是总线层上的易失性存储设备。教授在白板上写下他们大脑中的公式,学生将这些公式复制到纸上,长期存储。 运行 教授用完白板并开始擦除一些信息以为更多信息腾出空间。白板只是教授和学生笔记本之间的缓存。建楼的时候,白板没理由pre-loaded一讲零头。它旨在使用和重复使用 运行 时间。