refactor: extract ports/drivers/bins layers — clean dependency inversion

Separate abstractions from implementations following DIP:

  servers/              drivers/
      │                     │
      ▼                     ▼
    ports/  (trait-only crates, zero deps)

New crates:

ports/ (abstractions):
  - port-framebuffer: Framebuffer trait
  - port-block-device: BlockDevice trait + SectorId
  - port-input-device: InputDevice trait + InputEvent types

drivers/ (implementations depend on ports/):
  - driver-framebuffer-virtio: VirtIO GPU framebuffer
  - driver-framebuffer-mock: test double
  - driver-block-virtio: VirtIO block device

bins/ (composition roots wire server + driver):
  - display-qemu: DisplayServer<VirtioFramebuffer>
  - storage-qemu: storage server with VirtIO block

Servers no longer own their hardware traits or driver code.
Neither server nor driver depends on the other — both point
inward to the port abstraction.
This commit is contained in:
2026-10-18 13:13:53 +02:00
parent 38f20cc3c4
commit 5766c6f7f7
39 changed files with 272 additions and 217 deletions

View File

@@ -41,6 +41,14 @@ members = [
"crates/types",
"crates/userspace",
"crates/userspace-rt",
"crates/ports/framebuffer",
"crates/ports/block-device",
"crates/ports/input-device",
"crates/drivers/framebuffer/virtio",
"crates/drivers/framebuffer/mock",
"crates/drivers/block/virtio",
"crates/bins/display-qemu",
"crates/bins/storage-qemu",
]
resolver = "2"
@@ -84,6 +92,16 @@ telephony-server = { path = "crates/servers/telephony-server" }
usb-server = { path = "crates/servers/usb-server" }
user-manager = { path = "crates/servers/user-manager" }
# ports
port-framebuffer = { path = "crates/ports/framebuffer" }
port-block-device = { path = "crates/ports/block-device" }
port-input-device = { path = "crates/ports/input-device" }
# drivers
driver-framebuffer-virtio = { path = "crates/drivers/framebuffer/virtio" }
driver-framebuffer-mock = { path = "crates/drivers/framebuffer/mock" }
driver-block-virtio = { path = "crates/drivers/block/virtio" }
# apps
snake = { path = "crates/apps/snake" }