我在assembly / c中开发了一个运行基本终端的基本内核。我把它设置为用grub运行iso。
我想继续使用这个操作系统,但是如果没有文件系统,我觉得好像没有别的我可以做的。经过很长一段时间在互联网上,我想出了我无法实现的任何事情。
人们已经说过实现FAT或制作VFS,但没有任何进一步的,也没有任何教程,也没有任何对任何地方的引用。
有人可以解释一下文件系统是如何工作的,我可以在哪里开始/在哪里可以连接预制系统,以及如何使用它?
另外,在编译我的操作系统时,我无法访问标准库。我使用gcc,nasm,ld和grub-mkrescue(用于磁盘映像)。我使用qemu进行模拟。
编辑减少OT
有人可以详细描述文件系统的工作原理,所以当我查看已经实现的文件系统的来源(如FAT)时,我可以理解如何将它应用到我自己的操作系统中吗?
编辑 - 更简单
更容易。我怎么能直接访问硬盘?我的内核完全在保护模式下运行,因此我可以切换并直接写入硬盘驱动器。可以使用如下文件实现文件系统:
名称 特殊字符 文字 特殊字符
即:
hello world.script 0x00 println" Hello,world !!" 的 0×00
在您不需要特殊细分的情况下,您只需查看文件名和特殊字符(不在字符串中的内容,如' \ 0'),然后阅读,直到您找到第二个非字符串字符。
是否有办法通过切入和退出保护模式或写入硬盘驱动器来实现此目的来访问硬盘?
答案 0 :(得分:9)
首先,请阅读file systems上的wikipage以获得一些广泛的观点。
关于operating system开发的相关资源是OSdev(但也许您的问题在这里是偏离主题的)。 Kernelnewbies也可以提供帮助(解释Linux的运作方式)。 OSdev有wikipages解释FAT& Ext2详细信息。
您可以设计一个没有任何文件的操作系统(但是其他一些persistence机器)。见this answer。您可以拥有持久性流程(另请阅读application checkpointing,garbage collection,continuations,hibernation)。
但是你应该阅读一些关于操作系统的好书(例如by Tanenbaum或可免费下载的Operating Systems: Three Easy Pieces书)。熟练掌握一些现有的免费软件操作系统,例如: Linux(& POSIX),请阅读Advanced Linux Programming(至少要了解很多概念并获得一个好的术语)。
恕我直言,FAT是一个丑陋而低效的文件系统,不值得研究(除了遗留和兼容性原因)。 Ext4(见here)应该更好& Ext2上的wikipage有一幅很好的画面。
您可以调整一些提供文件系统的库(例如libext2)到您的内核。
您可以调整sqlite来处理原始磁盘分区。
您可能有file的概念,它与MSDOS(或Windows)或POSIX或<stdio.h>
文件不同。例如,它可能是一系列固定大小的记录(例如1Kbyte),而不是字节流。
您可以将操作系统组织为microkernel,并拥有应用程序代码提供的文件系统。查看VSTa和HURD。
您当然需要一个磁盘驱动程序,它从驱动器中获取/写入块(4K字节)(磁盘I / O始终是块或disk sectors。旧的小磁盘有512字节块。新的大磁盘有4K字节,请参阅advanced format)。应该是中断驱动并使用DMA。您需要一个任务scheduler。 AFAIU,您won't使用BIOS(也许是UEFI);您需要了解常见硬件(SATA&amp; AHCI)的工作原理。
您应该将您的玩具操作系统(今天!)发布为free software(例如,在GPLv3上github +下)以获得反馈和贡献。
您可以复制(如果许可证兼容)来自其他free software操作系统的现有代码,您当然会研究他们的源代码来理解事物。
因此编写一些任务调度程序,一个page fault处理程序,一个virtual memory,然后添加中断驱动的磁盘IO,以及一些上面的文件系统代码。然后你就会开始明白操作系统不能是小型玩具....你可以考虑使用微内核或exokernel方法。
答案 1 :(得分:3)
如果许可条款适合您的需要,最简单的方法是使用现有的开源文件系统。 ELM FatFs就是这样一个库,没有任何使用限制。您只需使用提供的存根和示例提供设备控制接口层。