|
http://www.ix88.com/jichu/Linun/8741.html 一个更简单的方法
明白了以上知识之后,我们将用下面的方式为那四个“counter”文件创建列表: static struct tree_descr OurFiles[] = { { NULL, NULL, 0 }, /* Skipped */ { .name = "counter0", /* Inode 1 */ .ops = &lfs_file_ops, .mode = S_IWUSR|S_IRUGO }, { .name = "counter1", /* Inode 2 */ .ops = &lfs_file_ops, .mode = S_IWUSR|S_IRUGO }, { .name = "counter2", /* Inode 3 */ .ops = &lfs_file_ops, .mode = S_IWUSR|S_IRUGO }, { .name = "counter3", /* Inode 4 */ .ops = &lfs_file_ops, .mode = S_IWUSR|S_IRUGO }, { "", NULL, 0 } /* Terminates the list */ }; 一旦simple_fill_super()返回,大功告成,文件系统也 可用了。省下的唯一一个细节也许就是你的open()方法;如果你有多个文件共享同一个file_operations结构体,你将需要指出当前操作的是 哪个。这里的关键就在于inode号,也就是i_ino成员。修改过的lfs_open()通过以下方式找到正确的计数器: static int lfs_open(struct inode *inode, struct file *filp) { if (inode->i_ino > NCOUNTERS) return -ENODEV; /* Should never happen. */ filp->private_data = counters + inode->i_ino - 1; return 0; } 函数read()和write()用成员private_data_field,因此我们没有必要修改上个版本的实现。 结论 这里仅作为libfs示例,实际上libfs的代码被广泛应用于实现驱动特定的虚拟文件系统。如想深入学习,请参考2.5内 核源码的如下几个地方:
请记住,2.6的驱动模型代码使得用自己的虚拟文件系统导出信息变得容易;就很多应用而 言,它将成为把信息导到用户空间的较好方法。 驱动移植系列 有很多关于驱动模型和sysfs的文章。但是,在只有一个定制的文件系统才能奏效的情况下,libfs使 得这项工作变得(相对)简单。 译者注: 以前有人问我哪里能获得有关Linux变化和发展的介绍性文章,我无言以对。现在,总算知道了些有较好技术文章的网站,比如说lwn, linuxjournal和IBM的developer works。 这篇文章最开始写于2003年11月11号(似乎是光棍节),可我现在才注意到,真是感觉有些落伍啊!不敢独享,遂翻译出来与诸君共同把玩! 本想用一年时间熟悉Linux内核的开发,知其然,可随着时间的推进,发现其实知其然和知其所以然是相辅相成的,窃喜! BTW: 翻译东西还真的很不简单啊,不要笑我哦! |
