Add VFS, start of initrd
diff --git a/src/kernel/vfs.c b/src/kernel/vfs.c
new file mode 100644
index 0000000..59ccaf5
--- /dev/null
+++ b/src/kernel/vfs.c
@@ -0,0 +1,49 @@
+#include "vfs.h"
+
+uint fs_read(struct fs_node *node, size_t offset, size_t size, uchar *buffer)
+{
+	if (!node || !node->vtable || !node->vtable->read)
+		return 0;
+
+	return node->vtable->read(node, offset, size, buffer);
+}
+
+uint fs_write(struct fs_node *node, size_t offset, size_t size, uchar *buffer)
+{
+	if (!node || !node->vtable || !node->vtable->write)
+		return 0;
+
+	return node->vtable->write(node, offset, size, buffer);
+}
+
+void fs_open(struct fs_node *node)
+{
+	if (!node || !node->vtable || !node->vtable->open)
+		return;
+
+	node->vtable->open(node);
+}
+
+void fs_close(struct fs_node *node)
+{
+	if (!node || !node->vtable || !node->vtable->close)
+		return;
+
+	node->vtable->close(node);
+}
+
+struct fs_dirent *fs_readdir(struct fs_node *node, uint index)
+{
+	if (!node || !node->vtable || !node->vtable->readdir || (node->flags & 7) != FS_DIRECTORY)
+		return NULL;
+
+	return node->vtable->readdir(node, index);
+}
+
+struct fs_node *fs_finddir(struct fs_node *node, char *name)
+{
+	if (!node || !node->vtable || !node->vtable->finddir || (node->flags & 7) != FS_DIRECTORY)
+		return NULL;
+
+	return node->vtable->finddir(node, name);
+}