I am currently writing a microkernel based operating system (called alpha) as my project work for school. To keep things simple I decided to choose the x86 as the only target processor. When I was at the point to implement the virtual file system, I just coded right away. But when it was half finished I started feeling unhappy with my implementation. So I started to rewrite the whole thing with a different approach.
Let me explain my new implementation idea a bit. As my operating system is microkernel based, all servers, drivers, etc. are own user space processes. So the whole virtual filesystem is split into many different parts that communicate with each other by using ipc mechanisms. My idea is to have a central module where all device and filesystem servers can register themselves. This central module is also the owner of the main filesystem tree. You can then request this module to mount a specific device with a specific filesystem somewhere in its filesystem tree. All file operations are routed through this module so device mounts are easy to handle.
At the moment I am coding a framework that will allow to easily write a new filesystem or device driver and a library to communicate with the central module to handle file access.