我想知道操作系统是如何读取/写入硬盘驱动器的
我想练习一个简单的文件系统,没有可以读写文件的目录
我从哪里开始?
C / C ++会不会采用更低级别的方法?或者我必须采用更低级别的方法吗?
一个人处理太多了吗?
答案 0 :(得分:18)
看看FUSE:http://fuse.sourceforge.net/
这将允许您编写文件系统而无需实际编写设备驱动程序。从那里开始,我将从一个文件开始。基本上创建一个(例如)100MB长度的文件,然后编写您的例程以从该文件读取和写入。
一旦您对结果感到满意,那么您可以考虑编写设备驱动程序,并使驱动程序在物理磁盘上运行。
好消息是你几乎可以使用FUSE语言,而不仅仅是C / C ++。
答案 1 :(得分:7)
答案 2 :(得分:7)
为了学习文件系统的想法,我认为没有必要使用磁盘。只需创建一个512字节字节数组的数组。想象一下,这是你的Harddisk开始尝试一下。 此外,您可能希望了解一些标准操作系统教科书,如http://codex.cs.yale.edu/avi/os-book/OS8/os8c/index.html
答案 3 :(得分:3)
你的第一个问题的答案是,除了Fuse之外,正如别人告诉你的那样,你也可以使用Dokan为Windows做同样的事情,而且只需要对物理分区进行读取和写入的问题({ {3}}(特别是关于物理磁盘和卷的部分)。
当然,在Linux或Unix中,除了使用像Fuse之类的东西,你只需要在/ dev / xxx(如果你是root用户)中发出对所需设备的读写调用,并且在这些术语中,Unices更多友好或不安全取决于你的观点。
从那里尝试实现像Fat这样的简单文件系统,或像tar文件系统那样更开放的东西,甚至是基于UFS或Minux等Unix概念的简单文件系统,或只是记录所做调用的东西和他们的日志文件的参数(这将有助于您理解在常规使用计算机期间对文件系统驱动程序进行的调用)。
现在你的第二个问题(回答起来要简单得多),是的,C / C ++会做到这一点,因为它们是系统开发的通用语言,你的很多示例代码也会用C / C ++你至少会在开发中阅读C / C ++。
现在提出第三个问题,是的,一个人可以做到这一点,例如ext文件系统(在Linux世界中由其继承人在ext2或ext3中广为人知)是由一位开发人员Theodore Ts'o制作的,所以不要我认为这些事情不是一个人可以做到的。
现在最后的注释,记住真正的文件系统与常规内核中的许多其他子系统交互,例如,如果你有一台笔记本电脑并且休眠它,文件系统必须刷新对打开文件所做的所有更改,如果你在分区上有一个页面文件,或者即使页面文件有自己的文件系统,也会影响你的文件系统,特别是块大小,因为它们往往相等或者是页面块大小的功能,因为它很容易放置一个阻止来自内存上的文件系统,巧合等于页面大小(因为这只是一次传输)。
而且,安全性,因为您需要控制用户以及他们读/写的文件,这通常意味着在打开文件之前,您必须知道用户登录了什么,以及他拥有哪些权限那个文件。显然没有文件系统,用户无法运行任何程序或与机器交互。现代文件系统层也由于存在网络和分布式文件系统而与网络子系统交互。
因此,如果您想了解内核文件系统,那么您需要担心的一些事情(除了了解VFS界面)
P.S。:如果你想让Unix权限在Windows上运行,你可以在服务器版本的windows上使用MS用于NFS的东西(http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx)
答案 4 :(得分:2)
只是Coyote21所说的补充。你可以阅读这篇论文http://www.minix3.org/theses/gerofi-minix-vfs.pdf
在本论文中,您可以了解更多关于VFS的知识,并在那里描述一些细节。附录B中有非常有用的东西。有一个文件系统的实现(不是真正的文件系统,而是内存中的一个)。