内存与队列
网络数据面使用有界、预分配、move-only 的所有权流水线。当前不承诺端到端 zero-copy;目标是让 DMA buffer 在 queue CPU 与唯一 protocol CPU 之间的每次转移都 可证明,并让 ring 满、submit retry、stop/rollback 不会复制或泄漏 token。
1. 内存域
| 内存域 | 对象 | owner |
|---|---|---|
| hardware/DMA | DmaBuffer、descriptor/virtqueue | fixed-CPU QueueGroupExecutor |
| queue/protocol boundary | 四条 SPSC ring + pending_* slot | 每条唯一 producer/consumer |
| Ethernet frame | DMA ProtocolRxFrame 或兼容 ProtocolEthernetFrame | 唯一 protocol executor |
| Router packet buffer | Router.rx_buffer / tx_buffer | 唯一 protocol executor |
| smoltcp socket buffer | TCP SocketBuffer、UDP/raw PacketBuffer | SocketSet / protocol executor |
| user buffer | syscall IoBuf/IoBufMut | 调用者 |
hard IRQ 不拥有 DMA payload。它只拥有 endpoint-local status snapshot,并发布对应 group。
2. Move-only DMA token
DmaBuffer 不实现 Clone/Copy。buffer 包含 CPU mapping、bus address、capacity、
effective length 与 DMA sync 能力。合法 RX 状态:
pool
-> IRxQueue::submit / initial_refill
-> device DMA ownership
-> IRxQueue::reclaim -> RxCompletion { buffer, packet_len }
-> submit replacement before publishing completion
-> RX-ready SPSC -> ProtocolRxFrame
-> EthernetDevice -> Router -> smoltcp RxToken::consume
-> RxRecycler -> RX-recycle SPSC/overflow
-> queue-local spares -> later replacement
合法 TX 状态:
pool
-> TX-free SPSC
-> protocol fills frame
-> TX-ready SPSC
-> ITxQueue::submit_with_options -> flush
-> device DMA ownership
-> ITxQueue::reclaim
-> TX-free SPSC
SubmitError 必须携带原 buffer。Retry 时 runtime 保存在 pending_tx 或
pending_rx_refill;terminal error 也先恢复可回收 ownership,再决定 group failure。