Here is an example of a very, very basic FUSE implementation that is backed by a glorified shared memory segment (xenstore). Its a fork of the original xenstore FUSE file system that I maintain.
You will also find some code to show you how to make Valgrind more helpful when debugging FUSE implementations.
You write functions for open / create / read / write / truncate / getattr / etc and pass them to fuse (line numbers are from the linked example):
343 static struct fuse_operations const xsfs_ops = {
344 .getattr = xsfs_getattr,
345 .mknod = xsfs_mknod,
346 .mkdir = xsfs_mkdir,
347 .unlink = xsfs_rm,
348 .rmdir = xsfs_rmdir,
349 .truncate = xsfs_truncate,
350 .open = xsfs_open,
351 .read = xsfs_read,
352 .write = xsfs_write,
353 .readdir = xsfs_readdir,
354 .create = xsfs_create,
355 .destroy = xsfs_destroy,
356 .utime = xsfs_utime,
357 .symlink = xsfs_symlink,
358 .init = (void *)xsfs_init
359 };
As you can see, its extremely self explanatory. A little searching would result in finding many basic file backed examples of FUSE implementations as well.
I highly recommend doing it entirely in user space, unless you have enough time to get familiar enough with the kernel.