Shihanmax
磁芯存储器原理:从磁化、寻址到一次 64 bit 读取
磁芯存储器(magnetic core memory)是早期计算机主存的主流形态,1950 年代到 1970 年代大量使用。它看起来像一张由细铜线和黑色小圆环编织成的网。那些黑色小圆环是铁氧体磁芯,每个磁芯存储 1 bit。
它和现代 DRAM、SRAM 的核心差别在于:现代半导体内存主要靠电荷或晶体管状态表达数据,磁芯存储器靠磁化方向表达数据。一个磁芯可以被磁化成两个稳定方向,例如顺时针方向定义为 1,逆时针方向定义为 0。断电后,磁芯仍然保留剩磁,所以它天然是非易失性的。
为什么磁芯能被磁化
磁芯通常由铁氧体材料制成。铁氧体不是普通金属铁,而是一类高磁导率、低导电率、带明显磁滞特性的陶瓷磁性材料。它能存储数据,依赖两个物理性质:材料内部存在可重排的磁畴;外部磁场撤掉以后,磁畴排列不会完全恢复到随机状态,而会留下剩磁。
磁性来自材料内部电子的自旋和轨道运动。很多材料内部的微观磁矩彼此抵消,整体不显磁性。铁、钴、镍以及许多铁氧体材料中,相邻磁矩受到交换相互作用约束,更容易形成有序排列。大量磁矩朝同一方向排列的小区域叫磁畴。
未磁化时,材料内部有很多磁畴,方向杂乱,整体磁场相互抵消。给穿过磁环的导线通电时,导线周围产生磁场。这个磁场沿磁环闭合路径作用,使一部分磁畴扩张、旋转或翻转。电流足够大时,磁芯整体磁化方向会被翻到目标方向。
这里的数据写入不是把某种东西“充进”磁芯,而是用电流产生磁场,再用磁场改变磁畴排列。断电后,由于磁滞和能垒,磁畴不会立刻退回无序状态,所以信息得以保留。
基本结构:一个磁环就是一个 bit
一个磁芯存一个 bit。要构成可寻址内存,就要把大量磁芯排成矩阵。典型结构里有 X 线、Y 线、sense 线和 inhibit 线。
X 线和 Y 线负责选址。磁芯排列在二维矩阵中,每个磁芯位于一根 X 线和一根 Y 线的交叉点。sense 线负责读出,当磁芯翻转时,磁通变化会在线上感应出一个短电压脉冲。inhibit 线负责写入控制,在某些位不该翻转时抵消部分写入磁场。
一个平面只能提供一个 bit 位。实际机器通常把多个这样的二维矩阵叠起来,形成多个 bit plane。假设机器字长是 64 bit,那么可以有 64 个 bit plane。每一层负责一个 bit 位,所有层共享同一组 X/Y 地址线。访问某个地址时,每一层相同位置的磁芯同时被选中,于是一次读出一个 64 bit 字。
寻址:重合电流选中一个交叉点
磁芯存储器的经典寻址方式叫 coincident-current addressing,中文可称为重合电流寻址。
它的技巧在于:单独一根地址线的电流故意设计成不足以翻转磁芯,只提供半个翻转电流。只有某根 X 线和某根 Y 线同时通电时,两股半电流在交叉点处叠加,才达到翻转阈值。
假设一个 bit plane 是 64 × 64 矩阵。要访问第 12 行、第 37 列,控制器让 X12 和 Y37 同时通半电流。X12 上的所有磁芯都受到半强度磁场,Y37 上的所有磁芯也受到半强度磁场,但只有 X12 与 Y37 的交叉磁芯同时受到两者作用,所以只有这个磁芯能翻转。
这套设计不需要给每个磁芯单独接一个开关。存储密度虽然按现代标准很低,但在分立元件时代非常有效:用一组横线和一组竖线,就能在一个二维阵列里选中任意一个点。
一次 64 bit 数据是怎么读出的
假设系统是 64 bit 字长,内存由 64 个 bit plane 组成,每个平面是 64 × 64 个磁芯。CPU 要读取地址 A 处的一个 64 bit 字。
CPU 先把地址 A 送到内存控制器。控制器把地址拆成 X 地址和 Y 地址。例如高 6 位选择 64 根 X 线之一,低 6 位选择 64 根 Y 线之一。若地址被译码为 X12、Y37,那么所有 bit plane 中第 12 行、第 37 列的磁芯都会被同时选中。
读取动作本质上不是“观察磁化方向”,而是强制把被选中的磁芯写成某个规定方向。通常可以理解为强制写 0。
如果某个磁芯原来就是 0,磁化方向不变,sense 线上没有明显感应脉冲。如果某个磁芯原来是 1,它会被翻转成 0,磁通发生突变,sense 线上出现一个短电压脉冲。sense amplifier 检测这个脉冲,将模拟信号转换成数字电平。
读出逻辑很直接:有脉冲表示原来是 1,无脉冲表示原来是 0。64 个 bit plane 各自通过 sense 线和感测放大器给出结果,控制器把这 64 个结果锁存进数据寄存器,CPU 看到的就是地址 A 处的 64 bit 数据。
这一步会破坏原数据。因为读操作把所有被选中的磁芯都强制写成了 0,原来为 1 的位已经被翻转。磁芯存储器的读取是破坏性读取。
所以控制器必须立即执行恢复写入。它重新选中同一个 X/Y 地址,根据刚才锁存的 64 bit 值把原来为 1 的位写回 1,原来为 0 的位保持为 0。对 CPU 来说,这只是一次普通读内存;对磁芯阵列和控制电路来说,实际流程是:选址、强制读出、感测脉冲、锁存数据、原址写回。
如果机器不是 64 bit 字长,而是 8 bit 或 16 bit 字长,那么同样一段 64 bit 数据可能需要连续读取 8 个字节或 4 个 16 bit 字。一次物理访问读多少 bit,取决于机器字长和内存组织方式。
写入:X/Y 选址加 inhibit 控制
写入同样依赖 X/Y 线选址。控制器选择某根 X 线和某根 Y 线,在交叉点形成足够大的磁场,把目标磁芯磁化到指定方向。
问题在于多个 bit plane 共用同一组 X/Y 地址线。如果一次访问的是 64 bit 字,64 个平面的同一位置都会受到同一个写入趋势。但 64 bit 字里不同位的值不可能都相同,有些位要写 1,有些位要写 0。
inhibit 线用于解决这个问题。写入时,X/Y 驱动器产生默认写入方向。对于不该被写成该方向的 bit plane,inhibit 驱动器提供一股反向电流,抵消一部分磁场,使对应磁芯不达到翻转阈值。这样同一次地址访问中,不同 bit plane 可以写入不同的 0/1 值。
地址译码器、控制器、驱动器如何实现
那个年代没有现代意义上的内存控制芯片。地址译码器、控制器、驱动器通常由硬连线逻辑搭成,早期可能用电子管、二极管、晶体管、脉冲变压器、磁放大器,后期使用分立晶体管逻辑、DTL 或 TTL 小规模集成电路。
以 64 × 64 × 64 bit 的内存为例,每个 bit plane 有 4096 个磁芯,64 个平面合计 262144 bit,即 32 KiB。每个地址对应一个 64 bit 字。一个平面内有 64 行和 64 列,所以地址至少需要 12 位:6 位选 X,6 位选 Y。
CPU 把地址送入地址寄存器。高 6 位进入 X 地址译码器,低 6 位进入 Y 地址译码器。译码器把二进制编码转换为 one-hot 选择信号:64 根 X 选择线里只有一根有效,64 根 Y 选择线里也只有一根有效。
逻辑上,译码器就是大量 AND 条件。例如某根输出只在输入等于特定 6 bit 模式时有效。早期可以用二极管矩阵和晶体管放大器实现,不匹配的输出被钳住,匹配的输出被放大成选择信号。后期可以用 3-to-8、4-to-16 这类译码器级联。
译码器输出不能直接驱动磁芯阵列。磁芯线需要的是精确幅度、精确方向、精确持续时间的电流脉冲。驱动器才是真正的功率级。它用晶体管、脉冲变压器、电阻和电感网络产生读写脉冲。控制器决定什么时候发脉冲,译码器决定脉冲送到哪根 X 线和哪根 Y 线。
控制器本质上是硬件状态机,由触发器、门电路、单稳态多谐振荡器、延迟线和时钟脉冲链组成。一次读周期中,它要完成地址锁存、X/Y 读驱动、sense 采样窗口、数据锁存、恢复写入、inhibit 控制和 ready 信号返回。
sense amplifier 是感测放大器。磁芯翻转产生的感应脉冲很短且幅度较小,而 X/Y 驱动线会带来很强的噪声。感测放大器通常只在控制器指定的窄时间窗口内采样。采早了容易读到驱动干扰,采晚了脉冲已经衰减。
完整链路可以概括为:CPU 地址线进入地址寄存器,地址译码器选中 X/Y 线,驱动器产生读写电流脉冲,磁芯阵列发生或不发生翻转,sense 线输出感应脉冲,感测放大器转换成数字信号,数据寄存器把结果交给 CPU。旁路还有控制器提供时序、方向、采样窗口、恢复写入和 inhibit 控制。
那个年代能存什么“文件”
严格说,磁芯存储器主要是主存 RAM,不是今天意义上的硬盘文件系统。它可以保存程序和数据,但长期保存通常依赖纸带、打孔卡、磁带、磁鼓或早期硬盘。
从信息论角度看,只要能编码为二进制,磁芯存储器都能存。现实中它主要存机器码程序、汇编程序、数字数据、表格记录、I/O 缓冲区、操作系统或监控程序的一部分,以及运行中的临时计算结果。
它理论上也能存图像、声音或视频,但容量成本不允许。早期磁芯内存常见规模只有几 KB、几十 KB,昂贵系统才到几百 KB甚至更高。一个 4 KB 磁芯内存只有 4096 字节,大概能存几页纯英文文本或一个很小的机器码程序。把现代图片、音频、PDF 或视频放进这种内存,在容量上基本不现实。
磁芯存储器的关键价值不在于容量,而在于它在当时提供了可随机访问、速度相对可接受、断电不丢失、可靠性较高的主存。它的物理结构很直观:一个磁环,一个 bit;两组地址线,选中一个交叉点;读出靠翻转产生的感应脉冲;读完再写回。正是这些看起来笨重的硬件细节,构成了早期计算机主存的基础。