
有些舊電腦/控制器沒有檔案系統,是因為這些設備沒有作業系統嗎?如果文件無法保存到這些設備中,工廠控制邏輯/程序和其他資料如何保存到設備中?
答案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
位元組的檔案和檔案名 - 能夠從一些失敗中恢復
- 支援更改文件長度而不移動後續文件
但你明白了。
現在,作業系統。大多數電腦的作業系統由檔案組成,因此您需要一個檔案系統來儲存作業系統。但是您可以建立一個不必使用持久性文件並且不儲存在文件中的整體作業系統。自由即時作業系統就是一個例子。因此,雖然檔案系統和作業系統通常緊密耦合,但它們實際上可以獨立存在。
我所說的「整體」是指「一段二進位代碼」。這將是一個所謂的斑點:沒有名稱、建立日期或任何其他屬性的位元組序列。畢竟,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 的風險。
Altair basic 在 8080 時代使用的作業系統非常簡約。您可以透過指定開始讀取檔案的磁頭和磁軌,將檔案儲存到硬碟。沒有使用檔案系統,使用者必須自己記住檔案保存的磁頭和磁軌號。
雖然不是一個磁碟作業系統,但它可以工作。讀取鍵盤和向顯示器發送訊息的例程也很少。
答案3
我認為這裡有兩點需要說明:
- 有些系統沒有檔案系統 - 這是否意味著它們沒有作業系統?
- 如果沒有檔案系統(或它是唯讀的),配置可以儲存在哪裡
裸機
有些系統沒有作業系統——只有一個應用程序,而且該應用程式軟體直接與硬體互動。這在複雜性較低的小型微控制器系統中很常見。在這種情況下,軟體通常是客製化的,開發團隊從頭開始編寫驅動程式和抽象,或使用供應商程式碼來實現他們的設計目標。
話雖這麼說,這樣的系統可能支援檔案系統。簡單的檔案系統,例如胖的通常用於儲存日誌並提供韌體更新功能。
配置通常會被格式化並直接寫入原始非揮發性存儲,而不使用檔案系統。
嵌入式系統 - 調度程序
上一個級別,我們發現系統稍大一些,複雜性也有所增加。此時我們會發現即時作業系統(RTOS) - 儘管並非全部都有即時要求 - 其設計具有特定的功能集。這些系統將由一組“任務” 計劃執行的任務 - 通常無法運行其他/任意任務。這些系統通常透過使用供應商或社群產生的程式碼輕鬆支援檔案系統、網路等。
配置可以寫入原始存儲,或作為檔案儲存在檔案系統中。
嵌入式系統
現在我們發現嵌入式系統更大。複雜性已經上升,在這個層級上,我們發現依賴檔案系統來組織系統配置和應用程式/軟體。我們現在能夠執行任意應用程序,並且核心將附帶用於各種硬體的完整驅動程式負載。
在這裡我們正在看Linux,QNX,”Windows 嵌入式緊湊型“, ETC...
軟體通常會被構建為了系統,調用諸如忙碌盒提供大部分功能,並使用類似的項目建構根目錄和約克托建立各種應用程式並生成圖像。
配置很可能會寫入檔案 - 儘管這並不能阻止開發人員像以前一樣使用原始存儲,因為這些系統通常在自訂硬體上運行。
文件系統是必需的,但可能不可寫,並且可能純粹是“在記憶中" - 大小有限,所有變更(如果是 RW)在重新啟動時都會遺失。
完整的用戶/伺服器系統
在這裡,我們看到的是運行視窗系統、讀寫檔案系統(通常在大磁碟上)、大量任意程式碼執行、配置絕對儲存為檔案的桌上型電腦——這是您熟悉的系統類型。從我們這裡討論的術語來看,伺服器通常與桌上型電腦非常相似。
在 Linux 世界中,這將是“分配「。您通常會發現某種形式的套件管理,因此安裝/卸載應用程式只需下載和解壓即可(如果您使用的是類似的工具,則也可以進行編譯)根圖)。
這裡我們看的是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/TOML)。