玩具操作系统文件系统[关闭]

2024-03-13

我已经在 assembly/c 中开发了一个运行基本终端的基本内核。我已将其设置为使用 grub 运行 iso。

我想继续使用这个操作系统,但是如果没有文件系统,我觉得我真的无能为力。在互联网上呆了很长时间后,我实在想不出我能做些什么来实现这一点。

人们说过实施 FAT 或制作 VFS,但没有任何进一步的内容,也没有教程,也没有任何地方的参考。

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

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

编辑以减少 OT

有人可以详细描述文件系统是如何工作的,这样当我查看已实现的文件系统(例如 FAT)的来源时,我可以了解如何将其应用到我自己的操作系统中吗?

编辑 - 更简单

甚至更容易。如何直接访问硬盘?我的内核完全在保护模式下运行,所以我可以切换出去并直接写入硬盘吗?文件系统可以用如下所示的文件来实现:

name 特殊字符 text 特殊字符

ie:

你好世界.脚本 0x00 println“你好,世界!!” 0x00

在不需要特殊分段的情况下,您只需查找,直到找到文件名和特殊字符(不在字符串中,如“\0”),然后读取,直到找到第二个非字符串字符。

有没有办法通过切换保护模式来访问硬盘或编写硬盘驱动器来实现这一点?


首先,阅读维基页面文件系统 https://en.wikipedia.org/wiki/File_system有一些广阔的视野。

相关资源关于操作系统 https://en.wikipedia.org/wiki/Operating_system发展是OSdev http://osdev.org/(但也许你的问题在这里是题外话)。内核新手 http://kernelnewbies.org/也可以提供帮助(解释 Linux 是如何做的)。 OSdev 有维基页面解释FAT http://wiki.osdev.org/FAT & Ext2 http://wiki.osdev.org/Ext2详细信息。

您可以设计一个没有任何文件的操作系统(但还有其他一些文件)坚持 https://en.wikipedia.org/wiki/Persistence_%28computer_science%29机械)。看这个答案 https://softwareengineering.stackexchange.com/a/285678/40065。你可以有持久的进程(另请阅读应用程序检查点 https://en.wikipedia.org/wiki/Application_checkpointing, 垃圾收集 https://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29, 延续 https://en.wikipedia.org/wiki/Continuation, 冬眠 https://en.wikipedia.org/wiki/Hibernation_%28computing%29).

但是您应该阅读一些有关操作系统的好书(例如通过塔南鲍姆 http://freecomputerbooks.com/Modern-Operating-Systems-by-Andrew-Tanenbaum.html,或免费下载操作系统:三个简单的部分 http://pages.cs.wisc.edu/~remzi/OSTEP/书)。熟练使用一些现有的自由软件操作系统,例如Linux(和 POSIX),所以请阅读高级Linux编程 http://advancedlinuxprogramming.com/(至少要理解许多概念并获得良好的术语)。

恕我直言,FAT https://en.wikipedia.org/wiki/File_Allocation_Table是一个如此丑陋且低效的文件系统,不值得研究(除了遗留和兼容性原因)。Ext4 https://en.wikipedia.org/wiki/Ext4 (see here http://kernelnewbies.org/Ext4)应该更好&维基页面Ext2 https://en.wikipedia.org/wiki/Ext2有一张漂亮的照片。

您可以改编一些提供文件系统的库(例如libext2 http://git.tyndur.org/?p=libext2.git;a=summary)到你的内核。

你也许可以适应sqlite http://sqlite.org/在原始磁盘分区上工作。

你可能有一个想法file https://en.wikipedia.org/wiki/Computer_file它不像 MSDOS(或 Windows)或 POSIX 或<stdio.h>文件。例如,它可能是固定大小的记录序列(例如 1Kbyte),而不是字节流。

您可以将您的操作系统组织为微内核 https://en.wikipedia.org/wiki/Microkernel并具有由应用程序代码给出的文件系统。调查VSTa https://en.wikipedia.org/wiki/VSTa and HURD https://www.gnu.org/software/hurd/hurd.html.

当然,您需要一个磁盘驱动程序,它可以从驱动器中获取/写入块(4K字节)(磁盘 I/O 始终按块或磁盘扇区 https://en.wikipedia.org/wiki/Disk_sector。旧的小磁盘有 512 字节的块。新的大磁盘有 4Kbytes,请参阅高级格式 https://en.wikipedia.org/wiki/Advanced_Format)。它应该是中断驱动并使用DMA https://en.wikipedia.org/wiki/Direct_memory_access。你需要一个任务调度程序 https://en.wikipedia.org/wiki/Scheduling_%28computing%29。阿法尤,你won't https://stackoverflow.com/a/31201991/841108为此使用 BIOS(也许UEFI https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface);你需要了解常见的硬件(SATA http://wiki.osdev.org/SATA & AHCI http://wiki.osdev.org/AHCI) works.

您应该发布(today!)你的玩具操作系统为自由软件 https://en.wikipedia.org/wiki/Free_software(例如,在GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html+ on github http://github.com/)以获得反馈和贡献。

您可以从其他地方复制(如果许可证兼容)现有代码自由软件 https://en.wikipedia.org/wiki/Free_software操作系统,你肯定会研究它们的源代码来理解事物。

所以编写一些任务调度程序,页面错误 https://en.wikipedia.org/wiki/Page_fault处理程序,一个虚拟内存 https://en.wikipedia.org/wiki/Virtual_memory,然后添加中断驱动的磁盘IO,以及上面的一些文件系统代码。然后你就会开始明白操作系统不能是一个small玩具....您可能会考虑微内核或外内核 https://en.wikipedia.org/wiki/Exokernel方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

玩具操作系统文件系统[关闭] 的相关文章

随机推荐

  • 加载共享库 libresolv.so.2 时出错:没有这样的文件或目录(/lib/libclntsh.so 需要)

    每次我尝试连接到 Oracle DB 时都会收到此错误 DPI 1047 Cannot locate a 64 bit Oracle Client library Error loading shared library libnsl so
  • 关于代码密度作为编程语言能力衡量标准的文章[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我记得看过一篇文章说这样的话 不同的编程语言引入的错误数量差异不大 但很大程度上取决于 SLOC 源代
  • 如何防止 React-native-device-info 导致我的设置出现 React 歧义?

    我在安装时遇到问题react native device info进入现有的反应本机项目 使用创建create react native app然后弹出 I run yarn add react native device info yar
  • Visual Studio 2010 不断改变我的 winforms 控件

    我在 VS 2010 中的用户控件遇到了奇怪的情况 表单设计者不断更改我的条目 然后告诉我它不存在 它第一次编译并运行 然后如果我更改一些不相关的内容 它会在 Designer cs 文件中给出错误 无法解析符号 SomeEntry pri
  • Android 位图、回收和堆碎片

    我有一个应用程序大量使用从 SD 卡读取的位图 我 99 确信如果不回收这些 我的应用程序永远不会被破坏 它们都被分配到 LRU 缓存 公共集合 中 当它们从 LRU 缓存中清除时 该缓存会回收它们 并且我回收剩余的onDestroy 尽管
  • 脚本输出中日期更改的奇怪问题

    我的一位同事编写了一个 Google Apps 脚本来自动化工作流程 批准酒店的客房补偿请求 总的来说 该脚本似乎按预期运行 脚本中有一个按自动计划运行的函数 基于时间 而不是事件驱动 曾有过几次因入住日期晚了一位而导致预订错误的情况 不幸
  • 使用 Xceed PropertyGrid

    我是 C WPF 的初学者 正在尝试使用 Xceed PropertyGrid 他们在他们的网站上展示了一个示例
  • 删除 Woocommerce 中特定产品类别的添加购物车按钮

    我遇到如何从类别产品中删除购物车的问题 如果我将它应用于特定的 ID 或一般情况下的所有 ID 它就可以正常工作 但我无法对类别执行此操作 下面是我对此所做的代码 另外 我正在努力将相同的模式应用到相关文章部分 因此任何帮助将不胜感激 谢谢
  • 如何使用 opencv 和 Python 找到 ROI 内的轮廓?

    我试图找到图像特定区域的轮廓 是否可以只显示 ROI 内的轮廓 而不显示图像其余部分的轮廓 我在另一篇类似的文章中读到我应该使用面具 但我认为我使用得不正确 我对 openCV 和 Python 很陌生 所以非常感谢任何帮助 import
  • 检测网络下拉菜单是否将显示在屏幕外

    我有一个基于 CSS 的简单多级下拉菜单 第二或第三级可能会超出可见窗口 具有某些分辨率和窗口大小的组合 如果某些预构建的菜单控件检测到这种情况 它们只会向左而不是向右打开下拉菜单 我如何测试 使用 JS jQuery 这种情况 您可以使用
  • Playbook 位于子目录中,而不是紧邻 group_vars

    有谁知道如何将剧本放入文件夹中 但共享相同的角色 group vars 以及通常位于根目录的其他内容 这就是我想要的 root dir group vars roles inventory playbooks my playbook yml
  • 如何强制 Jackson 将字段值反序列化为小写

    我有一个公开 REST 端点的 spring 应用程序 让我们将其命名为 doAction 作为请求 它消耗对象 class Person private String name private String email 一些客户端可以通过
  • matplotlib 获取轴相对刻度位置

    我知道我可以通过以下方式获得 y 刻度的位置ax get yticks 顺便说一句 这是获得它们的最佳 正确方法吗 但我需要相对于轴限制的刻度位置 即在 0 和 1 之间 获得这个的最好方法是什么 我试过ax get yticks tran
  • 通过引用传递 int 与通过值传递 int 的好处?

    通过引用而不是值传递整数是否有性能优势 我这样说是因为如果您通过引用传递 您将创建一个 4 字节指针 但如果您通过值传递 您无论如何都会创建该值的 4 字节副本 那么它们都多占用了 4 个字节 对吗 是否可以使用强制转换通过引用传递 int
  • AttributeRouting - 从 RouteData 获取操作名称的正确方法

    我最近开始为我的操作方法使用属性路由 并且正在努力从 RouteData 获取操作名称 和 或 id 下面是我如何使用属性的示例 Route Edit id int public ActionResult Edit int id 之前我使用
  • ReSharper PdbNavigator 在符号服务器上找不到调试信息

    我们设置了 TeamCity 来为内部组件创建 NuGet 包和符号源包 符号源包正确包含 dll pdb 和源代码 一旦 TeamCity 创建了包 它们就会发布到我们的 NuGet SymbolSource 服务器 在 ReSharpe
  • 如何使用 POI SS 打开 .xlsx 文件?

    我正在尝试使用 POI SS 使用此代码打开 xlsx 文件 取自http poi apache org spreadsheet quick guide html ReadWriteWorkbook http poi apache org
  • 如何在Java中从sql模式生成orm映射类

    我有一个现有的 db sql 模式文件 是否可以在需要时生成并重新生成 DAO 实体以及访问它所需的所有其他帮助程序 客户端类 我不介意它会是什么 hibernate 其他 jpa 或其他东西 假设您 其他人仍在寻找解决方案 我刚刚遇到了同
  • 模块函数、静态方法、类方法、无装饰器:哪个习惯用法更Pythonic?

    我是一名 Java 开发人员 时常使用 Python 我最近偶然发现本文 http dirtsimple org 2004 12 python is not java html其中提到了 Java 程序员在学习 Python 时常犯的错误
  • 玩具操作系统文件系统[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经在 assembly c 中开发了一个运行基本终端的基本内核 我已将其设置为使用 grub 运行 iso 我想继续使用这个操作系