devfs.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #include "devfs.h"
  2. #include <filesystem/VFS/VFS.h>
  3. #include <common/glib.h>
  4. #include <common/string.h>
  5. #include <mm/slab.h>
  6. static struct vfs_super_block_operations_t devfs_sb_ops;
  7. static struct vfs_dir_entry_operations_t devfs_dentry_ops;
  8. static struct vfs_file_operations_t devfs_file_ops;
  9. static struct vfs_inode_operations_t devfs_inode_ops;
  10. static struct vfs_dir_entry_t *devfs_root_dentry; // 根结点的dentry
  11. static struct vfs_superblock_t devfs_sb = {0};
  12. extern struct vfs_file_operations_t ps2_keyboard_fops;
  13. /**
  14. * @brief 创建devfs的super block
  15. *
  16. * @param blk 未使用(devfs为伪文件系统,不需要物理设备)
  17. * @return struct vfs_superblock_t*
  18. */
  19. struct vfs_superblock_t *devfs_read_superblock(struct block_device *blk)
  20. {
  21. devfs_sb.blk_device = NULL;
  22. devfs_sb.root = devfs_root_dentry;
  23. devfs_sb.sb_ops = &devfs_sb_ops;
  24. devfs_sb.dir_ops = &devfs_dentry_ops;
  25. // todo: 为devfs增加私有信息
  26. devfs_sb.private_sb_info = NULL;
  27. kdebug("devfs read superblock done");
  28. return &devfs_sb;
  29. }
  30. static void devfs_write_superblock(struct vfs_superblock_t *sb) {}
  31. static void devfs_put_superblock(struct vfs_superblock_t *sb) {}
  32. static void devfs_write_inode(struct vfs_index_node_t *inode) {}
  33. static struct vfs_super_block_operations_t devfs_sb_ops =
  34. {
  35. .write_superblock = &devfs_write_superblock,
  36. .put_superblock = &devfs_put_superblock,
  37. .write_inode = &devfs_write_inode,
  38. };
  39. static long devfs_compare(struct vfs_dir_entry_t *parent_dEntry, char *source_filename, char *dest_filename) {}
  40. static long devfs_hash(struct vfs_dir_entry_t *dEntry, char *filename) {}
  41. static long devfs_release(struct vfs_dir_entry_t *dEntry) {}
  42. static long devfs_iput(struct vfs_dir_entry_t *dEntry, struct vfs_index_node_t *inode) {}
  43. static struct vfs_dir_entry_operations_t devfs_dentry_ops =
  44. {
  45. .compare = &devfs_compare,
  46. .hash = &devfs_hash,
  47. .release = &devfs_release,
  48. .iput = &devfs_iput,
  49. };
  50. static long devfs_open(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr) { return 0; }
  51. static long devfs_close(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr) {}
  52. static long devfs_read(struct vfs_file_t *file_ptr, char *buf, int64_t count, long *position) {}
  53. static long devfs_write(struct vfs_file_t *file_ptr, char *buf, int64_t count, long *position) {}
  54. static long devfs_lseek(struct vfs_file_t *file_ptr, long offset, long origin) {}
  55. static long devfs_ioctl(struct vfs_index_node_t *inode, struct vfs_file_t *file_ptr, uint64_t cmd, uint64_t arg) { return 0; }
  56. static long devfs_readdir(struct vfs_file_t *file_ptr, void *dirent, vfs_filldir_t filler)
  57. {
  58. // 循环读取目录下的目录项
  59. struct vfs_dir_entry_t *dentry = file_ptr->dEntry;
  60. struct List *list = &dentry->subdirs_list;
  61. // 先切换到position处
  62. for (int i = 0; i <= file_ptr->position; ++i)
  63. {
  64. list = list_next(list);
  65. if (list == &dentry->subdirs_list) // 找完了
  66. goto failed;
  67. }
  68. // 存在目录项
  69. // 增加偏移量
  70. ++file_ptr->position;
  71. // 获取目标dentry(由于是子目录项,因此是child_node_list)
  72. struct vfs_dir_entry_t *target_dent = container_of(list, struct vfs_dir_entry_t, child_node_list);
  73. // kdebug("target name=%s, namelen=%d", target_dent->name, target_dent->name_length);
  74. char *name = (char *)kzalloc(target_dent->name_length + 1, 0);
  75. strncpy(name, target_dent->name, target_dent->name_length);
  76. uint32_t dentry_type;
  77. if (target_dent->dir_inode->attribute & VFS_ATTR_DIR)
  78. dentry_type = VFS_ATTR_DIR;
  79. else
  80. dentry_type = VFS_ATTR_DEVICE;
  81. return filler(dirent, file_ptr->position - 1, name, target_dent->name_length, dentry_type, file_ptr->position - 1);
  82. failed:;
  83. return 0;
  84. }
  85. static struct vfs_file_operations_t devfs_file_ops =
  86. {
  87. .open = &devfs_open,
  88. .close = &devfs_close,
  89. .read = &devfs_read,
  90. .write = &devfs_write,
  91. .lseek = &devfs_lseek,
  92. .ioctl = &devfs_ioctl,
  93. .readdir = &devfs_readdir,
  94. };
  95. /**
  96. * @brief 创建新的文件
  97. * @param parent_inode 父目录的inode结构体
  98. * @param dest_dEntry 新文件的dentry
  99. * @param mode 创建模式
  100. */
  101. static long devfs_create(struct vfs_index_node_t *parent_inode, struct vfs_dir_entry_t *dest_dEntry, int mode)
  102. {
  103. }
  104. static struct vfs_dir_entry_t *devfs_lookup(struct vfs_index_node_t *parent_inode, struct vfs_dir_entry_t *dest_dEntry)
  105. {
  106. kdebug("devfs_lookup: %s", dest_dEntry->name);
  107. return NULL;
  108. }
  109. static long devfs_mkdir(struct vfs_index_node_t *inode, struct vfs_dir_entry_t *dEntry, int mode) {}
  110. static long devfs_rmdir(struct vfs_index_node_t *inode, struct vfs_dir_entry_t *dEntry) {}
  111. static long devfs_rename(struct vfs_index_node_t *old_inode, struct vfs_dir_entry_t *old_dEntry, struct vfs_index_node_t *new_inode, struct vfs_dir_entry_t *new_dEntry) {}
  112. static long devfs_getAttr(struct vfs_dir_entry_t *dEntry, uint64_t *attr) {}
  113. static long devfs_setAttr(struct vfs_dir_entry_t *dEntry, uint64_t *attr) {}
  114. static struct vfs_inode_operations_t devfs_inode_ops = {
  115. .create = &devfs_create,
  116. .lookup = &devfs_lookup,
  117. .mkdir = &devfs_mkdir,
  118. .rmdir = &devfs_rmdir,
  119. .rename = &devfs_rename,
  120. .getAttr = &devfs_getAttr,
  121. .setAttr = &devfs_setAttr,
  122. };
  123. static struct vfs_filesystem_type_t devfs_fs_type =
  124. {
  125. .name = "DEVFS",
  126. .fs_flags = 0,
  127. .read_superblock = devfs_read_superblock,
  128. .next = NULL,
  129. };
  130. static __always_inline void __devfs_init_root_inode()
  131. {
  132. devfs_root_dentry->dir_inode->file_ops = &devfs_file_ops;
  133. devfs_root_dentry->dir_inode->inode_ops = &devfs_inode_ops;
  134. // todo: 增加private inode info
  135. devfs_root_dentry->dir_inode->private_inode_info = NULL;
  136. devfs_root_dentry->dir_inode->sb = &devfs_sb;
  137. devfs_root_dentry->dir_inode->attribute = VFS_ATTR_DIR;
  138. }
  139. /**
  140. * @brief 初始化devfs的根dentry
  141. */
  142. static __always_inline void __devfs_init_root_dentry()
  143. {
  144. devfs_root_dentry = (struct vfs_dir_entry_t *)kzalloc(sizeof(struct vfs_dir_entry_t), 0);
  145. list_init(&devfs_root_dentry->child_node_list);
  146. list_init(&devfs_root_dentry->subdirs_list);
  147. devfs_root_dentry->dir_ops = &devfs_dentry_ops;
  148. devfs_root_dentry->dir_inode = (struct vfs_index_node_t *)kzalloc(sizeof(struct vfs_index_node_t), 0);
  149. __devfs_init_root_inode();
  150. }
  151. int devfs_register_device()
  152. {
  153. // 暂时只支持键盘文件
  154. char name[] = "keyboard.dev";
  155. struct vfs_dir_entry_t *dentry = vfs_alloc_dentry(sizeof(name));
  156. strcpy(dentry->name, name);
  157. dentry->name_length = strlen(name);
  158. dentry->dir_inode = (struct vfs_index_node_t *)kzalloc(sizeof(struct vfs_index_node_t), 0);
  159. dentry->dir_ops = &devfs_dentry_ops;
  160. dentry->dir_inode->file_ops = &ps2_keyboard_fops;
  161. dentry->dir_inode->inode_ops = &devfs_inode_ops;
  162. dentry->dir_inode->private_inode_info = NULL; // todo:
  163. dentry->dir_inode->sb = &devfs_sb;
  164. dentry->dir_inode->attribute = VFS_ATTR_DEVICE;
  165. dentry->parent = devfs_root_dentry;
  166. list_init(&dentry->child_node_list);
  167. list_init(&dentry->subdirs_list);
  168. list_append(&devfs_root_dentry->subdirs_list, &dentry->child_node_list);
  169. kdebug("add dev: %s", dentry->name);
  170. // devfs_create(&devfs_root_dentry->dir_inode, dentry->dir_inode, 0);
  171. }
  172. /**
  173. * @brief 初始化devfs
  174. *
  175. */
  176. void devfs_init()
  177. {
  178. __devfs_init_root_dentry();
  179. vfs_register_filesystem(&devfs_fs_type);
  180. vfs_mount_fs("/dev", "DEVFS", NULL);
  181. devfs_register_device();
  182. }