An x86-64 operating system built from xv6, now largely rewritten: SMP, a copy-on-write root filesystem (SchFS), PCI/USB/virtio drivers, a TTF rasteriser, and a Linux-numbered syscall ABI. No history before this point -- the tree was never under version control. This commit exists so the rename that follows has something to undo to.
42 lines
1.8 KiB
Markdown
42 lines
1.8 KiB
Markdown
# Schcom — the Schunix Compositor
|
||
|
||
Owns the display. Every pixel that reaches the screen goes through it.
|
||
|
||
Clients do not draw to the framebuffer; they draw into their own buffers and
|
||
hand them over. Schcom decides what is on top of what, composites the result,
|
||
and presents it. It also owns input: it reads the raw event devices and sends
|
||
each event to whichever client should have it.
|
||
|
||
That is the whole job. Window *placement* is not part of it — that is SchWM's,
|
||
and Schcom exposes a protocol for it rather than implementing policy itself.
|
||
|
||
## Status
|
||
|
||
Not started. Scoped only.
|
||
|
||
## What it needs from the kernel first
|
||
|
||
| Need | State |
|
||
|---|---|
|
||
| Shared memory (`shmget`/`shmat`/`shmdt`) | done |
|
||
| `mmap` of `/dev/fb0` | done |
|
||
| Framebuffer geometry via the fbdev ioctls | done |
|
||
| **Unix domain sockets**, with `SCM_RIGHTS` | **missing** — `socket()` is a `NO_LINUX` stub |
|
||
| **Raw input events** — key down/up with modifiers | **missing** — input only arrives cooked, through the tty line discipline |
|
||
| Mode setting and double buffering | **missing** — needs the virtio-gpu driver |
|
||
|
||
The two marked missing are hard blockers, not inconveniences. A client and
|
||
the compositor have to pass a buffer handle between them, and a pipe cannot
|
||
carry one. And a compositor that reads the tty gets line-buffered text
|
||
delivered to a single foreground process, which is not input in any sense it
|
||
can use.
|
||
|
||
## Design notes, so far
|
||
|
||
- **Buffers are shared memory, not pipes.** A pipe means copying every frame;
|
||
at 800×600×32 that is 1.9 MB per frame per client. shm exists for this.
|
||
- **One protocol, versioned from the start.** SchWM and SchDE are separate
|
||
programs, so the protocol is a real compatibility surface from day one, not
|
||
after the fact.
|
||
- **Policy belongs to SchWM.** If Schcom starts deciding where windows go, the
|
||
split has already failed.
|