Linux kernel 分析之十六:文件系统-用C来实现面向对象

来源:互联网 发布:linux tshark抓RTP包 编辑:程序博客网 时间:2024/05/22 07:49

          电脑用户跟文件系统打交道是非常频繁的。不过文件系统在结构上应该属于哪一层呢?它和设备驱动的关系如何?不同的系统有不同的理解。Linux把文件系统放在设备驱动之上,访问普通文件时,系统先执行文件系统的代码,把文件指针的偏移量映射为块设备的偏移量,然后调用驱动程序的代码。另一方面,Linux把设备也看作是一种特殊的文件。这有助于简化接口,对程序员来说是很方便的。
        我们可以把接口的观点扩展开来。对于应用程序来说,类库是一种接口;对于用户态程序来说,系统调用是一种接口;而对内核的一些模块(如文件系统,驱动程序)来说,内核也提供了很多接口;对于底层的软件开发者来说,处理器的指令集可以看作是接口;对于一辆奔驰汽车来说,各个零部件的规格说明书也可以算是一种接口。。。接口的出现是社会分工的需要,这有力地提高了开发效率。这使一部分人能够专注于编写简洁,高效和功能强大的接口,而另一部分人则专注于具体的需求。当然,在提高开发效率的同时,也会使人局限于某一个小领域。像Bill Joy(前任Sun的首席科学家,当年在Berkeley时主持开发了最早版本的BSD。还主持设计了sparc处理器)这类软硬通吃的计算机牛人将会越来越少。这也可以算是社会分工带来的代价吧。
        作为一个开放的系统。Linux也提供了文件系统的接口。这使它能够方便地支持ext2,fat32,reiserfs等很多种文件系统。最理想的状况是选择一个wizard,然后选择和填充若干属性,一路地Next下去,最后点OK,一个基本的文件系统就诞生了。接下去要做的只是实现一下里面的一些函数而已。当然,现在还没有这样的wizard,不过,基本思路是一致的,即把所有的文件系统中的公共接口抽象出来,让具体的文件系统去实现。这也是面向对象的思想。关于具体的接口,这方面的书已经讲得非常详细了,这里讲一讲如何用C语言来实现面向对象。
对不过问题也出来了:
1.根分区对应的设备是/dev/sda1,也就是说,要挂载根分区,就要读/dev/sda1,可是,/dev/sda1是保存在根分区上的一个文件, 也就是说,要读/dev/sda1,就要挂载根分区,这不是死锁了么?当然,解决办法是有的。关键在于/dev/sda1这个设备文件本身的信息不多,主要包括设备类型,主设备号与次设备号,这样,我们可以windows则相反,是把设备驱动放在文件系统之上。
0 0
原创粉丝点击