005. 内存接口
引入通用的内存设备接口。
第 5 / 356 · tests/chapter_01_cpu/test_005_memory_interface.py
需要创建的文件
emulator/memory/memory_device.py需要更新的文件
emulator/memory/ram.py位置
class MemoryDevice
class RAM(MemoryDevice)此步骤存在的原因
CpuBus 很快就要将访问路由到不同的设备。一个小型抽象接口可以让总线依赖读写行为,而不是具体的 RAM 实现。
完整示例实现
# emulator/memory/memory_device.py
from abc import ABC, abstractmethod
class MemoryDevice(ABC):
@abstractmethod
def read(self, addr: int) -> int:
...
@abstractmethod
def write(self, addr: int, value: int) -> None:
...
# emulator/memory/ram.py
from dataclasses import dataclass, field
from emulator.memory.memory_device import MemoryDevice
@dataclass
class RAM(MemoryDevice):
_data: bytearray = field(
default_factory=lambda: bytearray(0x800),
init=False,
)
def read(self, addr: int) -> int:
return self._data[addr]
def write(self, addr: int, value: int) -> None:
self._data[addr] = value重要不变量
MemoryDevice 只定义操作,不拥有存储或地址映射。
常见误解
抽象基类并不会使 RAM 的内容变得抽象。RAM 仍然拥有具体的字节存储;只是它可调用的边界是共享的。
范围之外
- 测试 006 中引入的 FakeROM
- 程序 ROM 的总线映射
- 只读卡带行为
运行本课
uv run pytest tests/chapter_01_cpu/test_005_memory_interface.py -v