|  | Channels | 
|  | This summarizes brainstorming ideas around different types of channels, and | 
|  | will eventually contain the design of different types of channels. | 
|  |  | 
|  | Protection and semantics of the message | 
|  | - Immutability of messages after sending | 
|  | - writes allowed (full trust) | 
|  | - read only | 
|  | - hand-off (enforce through PL or pagetable?) | 
|  | - Support for a twoway channel | 
|  | - just two one-way channels | 
|  |  | 
|  | - variability of the size in the channel | 
|  | - Request and Response size are different, so maybe we should handle them differently? | 
|  | Constant size: embed in the ring buffer? | 
|  | Variable size: Splitting request and data (fixed size ring buffer with pointers into a data page) | 
|  | - size of the msg | 
|  | - large -> remapping | 
|  | - small -> in buffer/ copy semantics | 
|  |  | 
|  | - Ack required for one way channel? | 
|  |  | 
|  | - Kernel one of the end point? syscall/sysevent | 
|  | - diff trust model etc | 
|  |  | 
|  | - Access control and Naming | 
|  | - related but distinct | 
|  | - Xenstore like/ hierarchical namespace | 
|  | - single entity knowing all channels? or managed by individual partitions? | 
|  | - create a channel to a service, what is the interface for that? | 
|  |  | 
|  | Access control: | 
|  | - check at load time | 
|  | - Singularity style manifests for diff. applications | 
|  |  | 
|  | - Multi-producer / Multi-consumer | 
|  | - Trust between the producers and trust between consumers | 
|  | - typically no trust between address spaces/ partitions, and full trust within? | 
|  |  | 
|  | - per core channel vs. per address space channel | 
|  |  | 
|  | - blocking semantics (block, fail, retry) | 
|  | - what to do when the queue is full? admission policy for channels? | 
|  |  | 
|  |  | 
|  |  |