一些旧式计算机/控制器没有文件系统,是因为这些设备没有操作系统吗?如果文件无法保存到这些设备,那么工厂控制逻辑/程序和其他数据如何保存到设备中?
答案1
文件系统基本上是在内存中存储文件的方法。
存储设备(例如硬盘、闪存驱动器、光盘、存储卡等)可以存储固定数量的字节。一个空的、已擦除的 48 字节内存包含以下内容:
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
现在,假设我有两个文本文件
- 第一个叫做问候语.txt并包含单词
Hello
。 - 另一个叫做用户名.txt并包含单词
gronostaj
。
文件使用以下方式进行编码ASCII,因此每个字母对应一个字节。使用 ASCII 编码后,文件的字节为:
姓名
47 72 65 65 74 69 6e 67 73 2e 74 78 74
内容
48 65 6c 6c 6f
姓名
55 73 65 72 6e 61 6d 65 2e 74 78 74
内容
67 72 6f 6e 6f 73 74 61 6a
(我使用该网站表格中第二列的十六进制值。)
我可以将第一个文件的内容放入我们的内存中,如下所示:
48 65 6c 6c 6f 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
但也存在一些问题。
- 如果我想将第二个文件放入内存中该怎么办?我如何知道一个文件在哪里结束,另一个文件在哪里开始?
- 文件有名称,我该如何存储它们?
为了解决这些问题,我们可以发明一个简单的文件系统。假设我们将文件名与其内容交错,这样每个文件名后面都有该文件的内容,并用零字节将它们分开。两个连续的零字节表示“没有更多文件”。
47 72 65 65 74 69 6e 67 <- first 8 bytes of name 1
73 2e 74 78 74 00 48 65 <- next 5 bytes of name 1, then 00, then 2 bytes of content 1
6c 6c 6f 00 55 73 65 72 <- next 3 bytes of content 1, then 00, then 4 bytes of name 2
6e 61 6d 65 2e 74 78 74 <- next 8 bytes of name 2
00 67 72 6f 6e 6f 73 74 <- 00, then 7 bytes of content 2
61 6a 00 00 00 00 00 00 <- 2 bytes of content 2, then 00 00, so no more files
或者同样的事情,但没有 ASCII 编码:(我们不能像那样将其存储在内存中,这只是为了可读性)
G r e e t i n g
s . t x t 00 H e
l l o 00 U s e r
n a m e . t x t
00 g r o n o s t
a j 00 00 00 00 00 00
真正的文件系统还会:
- 存储文件创建和修改日期、属性、权限、元数据和其他内容
- 包含某种目录,以便可以几乎立即访问文件,而无需扫描整个磁盘直到找到它们
- 支持目录
- 支持包含
00
字节的文件和文件名 - 能够从某些故障中恢复
- 支持在不移动后续文件的情况下改变文件长度
但你明白我的意思了。
现在,操作系统。大多数计算机的操作系统都由文件组成,因此您需要一个文件系统来存储操作系统。但您可以创建一个单片操作系统,它不必使用持久文件,也不存储在文件中。自由RTOS就是一个例子。因此,尽管文件系统和操作系统通常紧密耦合,但它们实际上可以独立存在。
我说的“单片”是指“单一的二进制代码”。这将是所谓的斑点:没有名称、创建日期或任何其他属性的字节序列。毕竟,CPU 只是处理指令序列。它们不关心文件元数据或文件系统,它们只想接收要执行的任务。如果你能将这些指令表示为字节,那么 blob 就足够了!
而且 blob 可以轻松存储在内存中,无需任何类型的文件系统。实际上,我们在第一个示例中就是这么做的,当时我们只是将文件 1 的内容放入内存中。
我希望这回答了你的问题!
答案2
BIOS、操作系统和文件系统是截然不同的独立元素,操作系统可以存在于设备上的只读内存中。因此,消息并不相同,但是操作系统只有一项工作,那就是作为程序和硬件之间的接口。如果设备没有操作系统,那么设备上运行的程序就是操作系统。
如果系统报告没有文件系统或者分区/文件系统损坏或不完整,那么听起来该系统很可能没有操作系统;但是
... 可能是大容量存储设备配置错误;或者更具体地说,bios 配置使用的磁头和磁道数量与设备格式化使用的磁头和磁道数量不同。发生这种情况时,引导程序无法加载完整的文件分配系统。系统是否有电池耗尽导致设置信息丢失。如果是这样,正确匹配 bios 设置和格式将恢复系统...
Bios 是硬件的基本接口。操作系统是程序使用的接口,该接口已经标准化,因此程序无需关心正在使用什么特定硬件。文件系统是访问大容量存储设备的标准数据表。
BIOS 首先从驱动程序接口设备上的只读存储器加载,并设置中断点以供访问。Int 13 是大容量存储设备的访问点。
https://en.wikipedia.org/wiki/INT_13H... 然后,BIOS 从设备的轨道 0、扇区 0 和引导例程加载分区表。http://www.ntfs.com/fat-partition-sector.htm
分区表告诉了我们硬盘的大小,以及位于机器地址分区表+3E十六进制的引导例程(如果我没记错的话,我的逆向工程位于机器上的 0000:063E 十六进制),通常会加载操作系统和更高级的驱动程序。
如果计算机的操作系统不支持大容量存储,您仍然可以接入此 BIOS 的支持并基于大容量存储设备构建系统扩展。但请注意,操作系统可能会打开和关闭中断,以保持对 BIOS 的请求连续。
BIOS 本身无法处理多线程操作。具体来说,需要调用 BIOS 来指示硬盘驱动器准备在特定位置进行读取或写入。然后,在第二次调用 BIOS 时进行读写操作。需要更先进的操作系统,因为必须有某种东西来阻止一个程序准备读取数据,而另一个程序想要写入数据,否则数据将被覆盖。
程序需要一个文件系统来使用大容量存储设备,而不会冒着覆盖数据或锁定其他程序使用硬盘或 BIOS 的风险。
在 8080 时代,Altair Basic 使用的操作系统非常简约。您可以通过指定从哪个磁头和磁道开始读取文件,将文件保存到硬盘驱动器。没有使用文件系统,用户必须自己记住文件保存的磁头和磁道号。
虽然不像磁盘操作系统那样好用,但还是可以运行。读取键盘和向显示器发送信息的程序也很少。
答案3
我认为这里有两点需要解决:
- 有些系统没有文件系统——这是否意味着它们没有操作系统?
- 如果没有文件系统(或者是只读的),配置可以存储在哪里
裸机
有些系统没有操作系统 - 只有一个应用程序,并且该应用软件直接与硬件交互。这在小型微控制器系统中很常见,因为其复杂性较低。在这种情况下,软件通常是定制的,开发团队从头编写驱动程序和抽象,或使用供应商代码来促进他们的设计目标。
话虽如此,这样的系统可能支持文件系统。简单的文件系统如胖的通常用于存储日志并提供固件更新功能。
配置通常会被格式化并直接写入原始非易失性存储,而无需使用文件系统。
嵌入式系统 - 调度程序
再往上一层,我们会发现系统会稍微大一点,复杂性也会增加。这时我们会发现实时操作系统(RTOS)——尽管并非所有都有实时要求——都是用一组特定的功能设计的。这些系统将用一组“任务“计划执行的任务 - 通常无法运行其他/任意任务。这些系统通常通过使用供应商或社区生成的代码来轻松支持文件系统、网络等。
配置可以写入原始存储,或作为文件存储在文件系统中。
嵌入式系统
现在我们发现嵌入式系统甚至更大。复杂性已经上升,并且在这个层面上我们发现对文件系统的依赖,以组织系统配置和应用程序/软件。我们现在能够执行任意应用程序,并且内核将附带各种硬件的大量驱动程序。
我们正在看Linux,微软,”Windows Embedded Compact“, ETC...
软件通常被构建为了该系统调用的项目如下忙碌箱提供大部分功能,并使用类似构建根和约克托构建各种应用程序并生成图像。
配置很可能会被写入文件中 - 尽管没有什么可以阻止开发人员像以前一样使用原始存储,因为这些系统通常会在定制硬件上运行。
文件系统是必需的,但可能不可写,并且可能纯粹是“在记忆中“——大小有限,并且所有更改(如果是 RW)都会在重启时丢失。
完整用户/服务器系统
这里我们讨论的是运行窗口系统、读写文件系统(通常在大磁盘上)的台式电脑,任意代码执行比比皆是,配置肯定以文件形式存储 - 这是您熟悉的系统类型。就我们在此讨论的术语而言,服务器通常与台式电脑非常相似。
在 Linux 世界中,这将是“分配“。你通常会找到某种形式的包管理,因此安装/卸载应用程序只需要下载和解压(如果你使用类似Gentoo)。
这里我们讨论的是 Linux,视窗,Windows 服务器, ETC...
上面我提到,较小的系统通常将配置存储在原始非易失性存储中。这是通过决定要存储的内容、整理数据并将其写入存储来完成的。
例如,我们可能想要存储以下简单配置:
- 法兰具有精确的
52458
旋转步骤 - 法兰必须旋转
5547
至05:00
- 法兰必须旋转至正
49885
电子18:00
这些数字都适合 16 位整数,所以我们用它来表示步骤。对于时间,我们决定以 BCD 格式存储,以便更好地兼容 RTC,就这样。
我们有以下数据:
- 52458 -->
0xCCEA
- 5547 -->
0x15AB
- 05:00 -->
0x0500
- 49885 -->
0xC2DD
- 18:00 -->
0x1800
这些值可以整理并以 10 个字节的形式写入存储器:
0x00000000 CC EA 15 AB 05 00 C2 DD 18 00
应用程序知道如何解释这一点,因此不需要支持。我所说的支持是指按名称(例如:文件系统和文件名)定位存储区域,并与人类分享对配置的理解(例如:JSON/XML/YAML/托木斯克)。