# Storage transports
Consumed by: `dev/blk/*`. The image and filesystem layers below these
controllers come from [`fstool`](https://github.com/KarpelesLab/fstool) — see
`ROADMAP.md` §7.1.
## Specifications
| ATA / ATAPI | [T13](https://www.t13.org/) — the ATA/ATAPI Command Set standards | Drafts historically free; final standards via INCITS |
| AHCI | Serial ATA AHCI Specification (Intel) | intel.com **[browser]** |
| NVMe | [NVM Express specifications](https://nvmexpress.org/specifications/) | **Free** |
| SCSI | [T10](https://www.t10.org/) — SPC (primary commands), SBC (block commands) | Drafts free |
| SD / MMC | SD Association simplified specifications | sdcard.org **[browser]** — the *simplified* specs are free |
| virtio-blk | [`virtio.md`](virtio.md) | Free |
NVMe and virtio-blk are both freely specified and much simpler to implement
correctly than ATA. Prefer them for new machines; implement ATA because legacy
guests require it.
## Working references
[OSDev: ATA PIO](https://wiki.osdev.org/ATA_PIO_Mode),
[AHCI](https://wiki.osdev.org/AHCI), [NVMe](https://wiki.osdev.org/NVMe).
## Implementation notes
- Controllers sit on `fstool::BlockDevice` (`std::io::Read + Write + Seek +
Send`). Do not invent a parallel block abstraction — but note it is `Send`,
*not* `Sync`, and its methods take `&mut self`, so a controller owns its
device behind the seam rather than sharing it. This is also why `dev/blk/*`
is one of the two documented `std` exceptions to the `no_std` rule.
- **The flush contract matters more than throughput.** A guest issuing FLUSH
expects durability; a snapshot taken mid-write must restore to a consistent
state. Decide the write-back cache semantics before writing the first
controller, not after.
- I/O runs on the task pool, with completions delivered through the event queue
at guest-derived virtual times (`ROADMAP.md` §4.7).
- `fstool`'s `crash_inject` block device gives guest-filesystem robustness
testing without extra work.