玩具OS文件系统

我在assembly / c中开发了一个运行基本终端的基本内核。 我把它设置为用grub运行iso。

我想继续这个操作系统,但没有文件系统,我觉得好像没有别的我能做的。 经过很长一段时间在互联网上,我已经想出了实现这一点我真的无能为力。

人们已经说过实现FAT或制作VFS,但没有任何进一步的,也没有教程,也没有任何参考。

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

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

编辑减少OT

有人可以详细描述文件系统的工作原理,所以当我查看已经实现的文件系统的来源(如FAT)时,我能理解如何将它应用到我自己的操作系统中吗?

编辑 – 更简单

更容易。 我怎么能直接访问硬盘? 我的内核完全在保护模式下运行,因此我可以切换并直接写入硬盘驱动器。 可以使用如下文件实现文件系统:

name 特殊字符 文本 特殊字符

即:

hello world.script 0x00 println“Hello,world !!” 为0x00

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

是否有办法通过切入和退出保护模式或写入硬盘驱动器来实现这一点?

首先,阅读文件系统上的wikipage以获得一些广泛的视图。

关于操作系统开发的相关资源是OSdev (但也许你的问题在这里是偏离主题的)。 Kernelnewbies也可以提供帮助(解释Linux的运作方式)。 OSdev详细解释了FAT和Ext2的 wikipages。

您可以设计一个没有任何文件的操作系统(但是其他一些持久性机制)。 看到这个答案 。 您可以拥有持久化进程(还可以阅读应用程序检查点 , 垃圾回收 , 延续 , hibernate )。

但是你应该读一些关于操作系统的好书(例如Tanenbaum )。 熟练掌握一些现有的免费软件操作系统,例如Linux(和POSIX),所以阅读高级Linux编程 (至少要了解很多概念并获得一个好的术语)。

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

您可以调整一些提供文件系统(例如libext2 )的库到您的内核。

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

您可能有一个与MSDOS(或Windows)或POSIX或文件不同的文件概念。 例如,它可能是一系列固定大小的记录(例如1Kbyte),而不是字节流。

您可以将操作系统组织为微内核,并使用应用程序代码提供文件系统。 看看VSTa和HURD 。

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

您应该( 今天! )将您的玩具操作系统发布为免费软件 (例如,在github上的GPLv3 +下)以获得反馈和贡献。

您可以复制(如果许可证兼容)来自其他免费软件操作系统的现有代码,您当然会研究他们的源代码来理解事物。

因此编写一些任务调度程序, 页面error handling程序, 虚拟内存 ,然后添加中断驱动的磁盘IO,以及上面的一些文件系统代码。 然后你就会开始明白操作系统不能是一个玩具……你可能会考虑使用微内核或外核方法。

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