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