linux上使用的是来自UNIX的文件系统的设计理念,采用的是一种开放式的架构,
该设计思想很是经典,主要就是体现在一种可拓展性和统一接口,VFS也算是linux设计
的一大亮点。该设计理念也可以借鉴到应用软件的设计中。
----------------------------------------------------------------------------------------
一,VFS的示意图。
--------------------------------------------------------------------------------------------
二、VFS的主要数据数据结构。
VFS主要有四个数据结构:
超级块对象:struct super_block 相当于一个具体文件系统的描述符。VFS为了管理若干个
具体的文件系统为每个具体的文件系统设置了该数据结构。该数据结构是由双向循环链表连起
来的,链表头是一个全局变量struct head_list super_blocks
索引节点对象:struct inode 该结构是文件的描述符,也就是FCB(file control block),
是对一个文件的具体的描述。
目录项对象:struct dentry 是对一个文件逻辑上的描述。
文件对象:struct file 用来描述进程打开的文件。
-------------------------------------------------------------------------------------------
三、对虚拟文件系统VFS四个对象中的字段进行分析。
待续...
----------------------------------------------------------------------------------------------
四、实战,使用内核模块遍历struct super_block双向循环链表
---------------------------------------------------------------------------------------------
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/kernel.h>
- #include <linux/types.h>
- #include <linux/list.h>
- #include <linux/spinlock.h>
- #include <linux/kdev_t.h>
- #include <linux/fs.h>
- //由于这个两个全局变量没有导出所以要直接使用地址
- #define SUPER_BLOCKS 0xc07c7814
- #define SB_LOCK 0xc0981280
- static int __init my_init(void)
- {
- struct super_block *sb;
- struct list_head *pos;
- spin_lock((spinlock_t *)SB_LOCK);
-
- list_for_each(pos,(struct list_head *)SUPER_BLOCKS) {
- sb = list_entry(pos,struct super_block,s_list);
- printk("name---->%s\t\t\t",sb->s_type->name);
- printk("dev_t %d:%d\n",MAJOR(sb->s_dev),MINOR(sb->s_dev));
- }
- spin_unlock((spinlock_t *)SB_LOCK);
- return 0;
- }
- static void __exit my_exit(void)
- {
- printk("---------------->exit\n");
- }
- module_init(my_init);
- module_exit(my_exit);
- MODULE_LICENSE("GPL");
---------------------------------------------------------------------------------------------
阅读(1282) | 评论(0) | 转发(0) |