玩具操作系统文件系统



我已经用汇编/c语言开发了一个运行基本终端的基本内核。我已经将其设置为在grub的iso文件下运行。

我想继续使用这个操作系统,但是如果没有文件系统,我觉得我真的无能为力。在网上花了很多时间之后,我真的没有办法实现这个。

人们说实现FAT或制作VFS,但没有更进一步,也没有教程,也没有任何参考资料。

有人能解释一下文件系统是如何工作的,我可以在哪里开始/我可以在哪里连接一个预制系统,以及如何使用它?

另外,在编译我的操作系统时,我无法访问标准库。我使用gcc、nasm、ld和grub-mkrescue(用于磁盘映像)。我使用qemu进行仿真。

EDIT to make less OT

谁能详细地描述一下文件系统是如何工作的,这样当我查看已经实现的文件系统的源代码时,比如FAT,我就能理解如何将它应用到我自己的操作系统上?

EDIT - simple

更容易。我怎样才能直接访问硬盘?我的内核完全在保护模式下运行,所以我可以切换到保护模式并直接写入硬盘驱动器。一个文件系统可以用这样的文件来实现:

<<p> 名称/em> 特殊字符文本特殊字符 ie:

hello world。脚本 0 x00 println"Hello, world !" 0 x00

在不需要特殊分割的地方,您只需查找直到找到文件名和特殊字符(不是像''这样的字符串中的字符),然后读取直到找到第二个非字符串字符。

是否有一种方法可以通过切换进入和退出保护模式或写硬盘驱动器来实现这一点来访问硬盘驱动器?

首先,阅读有关文件系统的wiki,以获得一个大致的视图。

关于操作系统开发的相关资源是OSdev(但也许您的问题在这里跑题了)。内核新手也可以提供帮助(解释Linux是如何工作的)。OSdev有解释FAT的wiki;

你可以设计一个没有任何文件的操作系统(但是一些其他的持久化机制)。看看这个答案。您可以使用持久进程(请参阅应用程序检查点、垃圾收集、延续、休眠)。

但是你应该读一些关于操作系统的好书(例如Tanenbaum的书,或者免费下载的Operating Systems: Three Easy Pieces书)。熟练使用一些现有的自由软件操作系统,如Linux (&POSIX),因此请阅读高级Linux编程(至少要理解许多概念并获得良好的术语)。

恕我直言,FAT是一个如此丑陋和低效的文件系统,不值得研究(除了遗留和兼容性原因)。Ext4(见这里)应该更好&Ext2上的wiki页面有一个不错的图片。

你可以将一些提供文件系统的库(例如libext2)适配到你的内核。

您也许可以调整sqlite以在原始磁盘分区上工作。

您可能有文件的概念,它不像MSDOS(或Windows)或POSIX或<stdio.h>文件。例如,它可能是一个固定大小的记录序列(例如1Kbyte),而不是一个字节流。

你可以将你的操作系统组织成一个微内核,并由应用程序代码提供文件系统。查看VSTa和HURD

您当然需要一个磁盘驱动程序,它从您的驱动器(磁盘I/O总是按块或磁盘扇区)获取/写入块(4kb)。旧的小磁盘有512字节块。新的大磁盘有4kb的磁盘(参见高级格式)。它应该是中断驱动的,并使用DMA。你需要一个任务调度程序。AFAIU,你不会使用BIOS(可能是UEFI);你需要了解常见的硬件(SATA &AHCI)。

你应该发布(今天!)你的玩具操作系统作为自由软件(例如GPLv3+在github上)获得反馈和贡献。

您可以从其他自由软件操作系统复制(如果许可证是兼容的)现有代码,并且您肯定会研究它们的源代码来理解事情。

因此,编写一些任务调度程序,页面错误处理程序,虚拟内存,然后添加中断驱动的磁盘IO,以及上面的一些文件系统代码。然后您将开始理解操作系统不可能是一个小的玩具....您可以考虑使用微内核或外部内核方法。

如果许可条款适合您的需要,那么使用现有的开源文件系统将是最简单的。ELM fatf就是这样一个库,没有任何使用限制。您只需要使用所提供的存根和示例提供设备控制接口层。

相关内容

最新更新