Library OSs can insert a block into the cache via sys_bc_insert and they may probe for an entry via __bc_lookup. Blocks may be read and written through the cache using sys_bc_read_and_insert and sys_bc_write_dirty_bufs. These are the non-XN interfaces. They do protection with proxy-exonodes which are basically just a way of associating lists of extents with capabilities. A user has to present the right capability to read/write a block in one of the extents. The NFS code in lib/libexeos/fd/nfs has some examples of how to setup a dummy proxy-exonode and then use it when interacting with the buffer cache. See the section on XN for how to read and write blocks using it since XN is the preferred protection method.