如果 RAM 中已经包含电容器中的位,那么在启动时如何将字节从二级存储设备加载到 RAM 中?

如果 RAM 中已经包含电容器中的位,那么在启动时如何将字节从二级存储设备加载到 RAM 中?

我今天一直在想这件事。

如果 RAM 的 IC 包含存储在电容器中的位,那么您如何从某处提取位并将它们放置在已经存在的位置?

例如,在启动时,我会在这里详细地说明我的困惑:

MOV AL, 07h

那是代码,而不是数据,因此它将是加载到 RAM 中的指令的一部分 - 但 RAM IC 中有一些位“位于”其中。按照这种逻辑,如何将一个位移动到另一个位已经存在的位置?

因为一般来说,处理器会通过总线从 RAM 中提取字节(无论它是代码还是数据),以确定如何处理它。

所以,如果不清楚的话,我的问题是:

当 RAM 已经占用位时,将字节/位移动到 RAM 有什么意义呢,即“2 GB DIMM 无缓冲”。

RAM 中的数据存放在电容器中,那么当 RAM总是启动前占用位?

如果题外话,很抱歉。

答案1

如果 RAM 的 IC 包含存储在电容器中的位,...

RAM(随机存取存储器)是一个通用术语,但您使用的方式很具体。
一般来说,计算机使用三种主要类型的 RAM 作为主存储器:

  • 铁氧体(磁芯)存储器:这种类型的 RAM 一直用于计算机,直到 20 世纪 70 年代和 80 年代半导体存储器占据了主导地位。这是一种非挥发性内存;您可以关闭计算机电源,然后在第二天或下周再打开它,而您的程序仍然会在内存中。
  • 静态存储器:一种半导体存储器,速度快但价格昂贵,密度低于 DRAM。这种存储器使用有源电路(即晶体管)来保存位状态。
  • 动态存储器:最常用于 PC 主存储器的半导体存储器。DRAM 使用电容器和刷新逻辑来保留其位值。

... 你如何能从某处拉出一些位并将它们放置在已经存在的地方?

这句话的意思是,位是无法移动的物理实体。
移动的“位”仅仅是值,而不是物理实体(除非实际指的是寄存器或存储单元等物理实体),尽管这些值通常被视为项目。

RAM 中的“位”仅仅是逻辑状态或存在条件。您可以举起手,也可以放下手:这是两种状态。RAM
中的每个单元都可以改变其状态(就像您可以举起或放下手一样)。
写入操作会引发这种状态改变。内存单元的先前状态将永远丢失。

...当 RAM 已经占用位时,即“2 GB DIMM 无缓冲”。

这句话有点别扭。RAM
(物理对象)不能“占用”“位”(即逻辑状态)。DRAM
(和 SRAM)在通电时将具有垃圾(随机)值,直到每个位置都写入为止。
一般来说,读取之前未写入(因此具有已知值)的内存是一种编程/逻辑错误。

RAM 中的数据位位于电容器中,...

当您实际关心的属性仅仅是它们的值时,请避免将“位”视为物理实体。

...那么 BIOS/固件如何将 CPU 的 IP 寄存器设置为下一条指令呢......

“启动”的第一步是“重置”操作,它将程序计数器 (PC) 初始化为已知值,或者您似乎更喜欢将“IP 寄存器”(指令指针?)。
假定引导程序存在于该“重置地址”处。
使用铁氧体内存的计算机通常会在“重置地址”处留出此内存区域来保存引导程序现代
计算机在“重置地址”处使用非易失性存储器(如 PROM、EPROM、EEPROM 或闪存)来保存引导程序

当 RAM 在启动之前总是占用位时?

这又是那句尴尬的话。
计算机通常被设计成“重置地址”指向引导程序在非易失性存储器中。
如果存储器是易失性的,那么某种机制(独立于通电和复位电路)必须用适当的引导程序。 这前面板计算机(IBM 兼容 PC 中从未包含的东西)可用于手动输入引导程序到 RAM 中。

附录

也许我的第一位编程老师灌输给我们的思想可能会有所帮助:

  • A(内存、寄存器或变量的)操作是非破坏性
    读取时该位置的值不会改变。重复读取将返回相同的值。
    (是的,有一些例外:自动递增的内存位置;内存映射的 I/O 端口;某些类型的 RAM 具有破坏性读取,每次读取后都会在内部重写。)
  • A(内存、寄存器或变量的)操作是破坏性的
    新值将取代旧值。一旦覆盖,就无法恢复旧值。

答案2

要知道“位”并不是一个真实的物理实体,而是存储单元的“状态”。一个给定的存储单元可以有 0 或 1 的值,这就是一个位。

当数据“移动”到内存中时,这意味着数据从磁盘读取为电信号(有点像电报信号),然后使用该数据来设置各个存储单元的新状态。

在一个非常简单的模型中(“现实生活”当然是很多更复杂)假设数据来自磁盘,是一系列的 0 和 1。我们假设这是一个非常慢速磁盘,每秒从磁盘传输一位数据。因此,您的 MOV 指令可能类似于1 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1,每个 1 用电线上的 1 伏表示,每个 0 用电线上的 0 伏表示。并且我们假设每个位(1 或 0)与下一个位相隔一秒。

接下来,我们需要一些“逻辑”(集成电路中的“门”和“触发器”)来接收这些数据并将其放入 RAM 中。

RAM 以 XY 矩阵排列。假设我们有一个很小大小仅为 8x8 位(总共 64 位)的 RAM。为了选择特定的存储单元,阵列中有 16 条导线,其中 8 条水平,8 条垂直。每条导线的交汇处都有一个存储单元(大多数情况下是电容器)。此外,所有单元都有另外三条导线:DataIn、DataOut 和 Write。

记忆看起来像这样:

   Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8
X1 b  b  b  b  b  b  b  b
X2 b  b  b  b  b  b  b  b
X3 b  b  b  b  b  b  b  b
X4 b  b  b  b  b  b  b  b
X5 b  b  b  b  b  b  b  b
X6 b  b  b  b  b  b  b  b
X7 b  b  b  b  b  b  b  b
X8 b  b  b  b  b  b  b  b

其中每个“b”都是一个可以保存 1 或 0 的存储单元。(未显示 DataIn、DataOut 和 Write 线。)

如果我在最顶部的水平线和最左边的垂直线上输入 1 伏电压,那么存储在这两条线连接处的单元(电容器)中的任何值(1 或 0)都将被“读取”并通过 DataOut 线输出。另一方面,如果我在 DataIn 线上输入 1 或 0,并在 Write 线上输入一个脉冲,那么所选单元的旧内容将被遗忘(存储在电容器中的电压会发生变化),并且 DataIn 线上的任何值都会保存在单元中。

因此,如果我只需将磁盘驱动器的那根线连接到内存的 DataIn 线,然后开始切换其他线,我就可以将磁盘数据写入 RAM。我需要有“逻辑”,每秒选择一次内存阵列的不同 X 和 Y 线。如果 X 和 Y 线的编号为 X1...X8 和 Y1...Y8,则将按以下顺序选择它们(即施加 +1 伏):X1&Y1、X1&Y2、X1&Y3、...X1&Y8、X2&Y1、X2&Y2、...X8&Y8。每次更换线时,写入线都会产生脉冲。

为了让这个小管弦乐队按时演奏,需要有一个指挥,所以计算机有一个“时钟”信号,它每秒脉冲一次并“标记时间”来记录到达的数据和所有其他信号的变化。

无论如何,当读入上述数据时,它将像这样进入我们的 8x8 RAM 中:

1 0 0 1 1 0 0 0 
0 0 0 0 0 1 1 1
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x

一旦读入了整个程序,计算机就可以开始从这小块内存中“获取”指令并执行它们。(本质上,在启动序列的情况下,BIOS 固件执行分支指令,使用我们获取的指令的 RAM 地址作为分支的目标。)“获取”基本上涉及重复上述序列,但不脉冲写入线,因此 RAM 数据从 DataOut 线上输出。

答案3

内存写入操作会将现有位更改为所需状态。不存在“未设置”位,它们始终为 0 或 1。

开机时会怎么样?一般会是随机状态,但无论如何都是确定的状态。如果距离上次断电时间不长,您就有可能恢复有效数据。

答案4

我看得出来你很困惑。:-)

首先,代码就是数据,它只是对处理器具有特定意义的数据[1]。

其次,“位”是电荷水平,像自来水一样沿着逻辑线移动。请注意,电荷水平(电压)不是实际的电子快速移动:虽然电子确实会移动,但与电压变化相比,它们的移动速度相当慢。

RAM 表示随机存取存储器,DRAM 中的 D 表示“动态”,因为它如果不刷新就无法持续很长时间。现代芯片具有内部刷新逻辑,它可以读取所有位并将其重新写回,从而重新为存储器充电。几乎所有 RAM 都将位存储为两种电荷水平,例如逻辑 0 的电位为 0 伏,逻辑 1 的电位为 1.5 伏。虽然并不常见,但有可能有多值位,因此对于存储 2 位(二进制数字)数据的单元,0 的电位为 0.. 0.1 伏,1 的电位为 0.9 .. 1.1 伏,2 的电位为 1.9 .. 2.1 伏,3 的电位为 2.9 .. 3.1 伏。

逻辑电路(内存或其他)中使用的实际电压并不重要,但连接元件的每条线路的两端当然必须就电压大小达成一致。如果您查看电子数据表,您会发现芯片将哪些电压解释为各个逻辑电平。TTL 逻辑的常见电压为 5 伏(标称值),0 到 0.5V 之间为逻辑 0,3.5 伏到 5.1 伏之间为逻辑 1。

当写入内存中的某个位置时,电子元件会进行设置,以便覆盖那里的任何内容 - 无论是 0 还是 1。有时,这种逻辑会以“错误”的方式工作:“自然”值是逻辑 1,而必须强制的值是 0。无论哪种方式,这都是 DRAM 芯片的问题:其他一切都将内存视为可以根据需要进行任意频繁写入和重写的地方。如果您想知道“旧”数据发生了什么,电荷会被发送到地,这也是芯片耗电的原因之一。

当处理器从内存中获取代码时,它会通过一系列阶段的管道发送:这些阶段的作用是加快处理器的速度。许多现代处理器也采用微程序:内部逻辑运行来自一个传入指令的多个“指令”,而这些内部指令甚至属于较低级别。要正确理解所有这些,您需要了解处理器的内部结构,而 x86 并不是开始的地方!!更简单的东西是 Rockwell 6502(Acorn BBC / C= 64 等)。此外,人们已经编写了模拟器,因此您可以非常轻松地玩各种游戏。

在启动时,大多数处理器将保持复位状态,直到所有外部逻辑都稳定下来。然后,它会将一个值加载到指令指针中并从该点获取指令,或者将内存中固定点的值加载到指令指针中,然后从该点获取指令。后者称为间接寻址。

PC 上的 BIOS 是 x86 处理器在启动时运行的代码。它曾经也用于整个操作系统的执行。在启动时,它的工作是将所有硬件置于良好(而不仅仅是稳定)状态,设置一个描述操作系统稍后将使用的硬件的表,找到可启动磁盘,如果成功,则将磁盘上的第一个扇区加载到 RAM 中并跳转到其中,期望该扇区包含启动代码。

真正的 PC 比这更复杂,EFI 也使事情复杂化,因此我强烈建议首先坚持使用 8 位微机,因为它们内部更简单且更窄。

高血压

[1] 有些处理器将用于代码的内存芯片与用于数据的内存芯片区分开来,这种处理器被称为“哈佛”架构内存。然而,即便如此,“代码就是数据”仍然是正确的。

相关内容