現代的ARM Linux開發者往往面對的是一塊開發闆,一個SOC,什麼都看不到,讓人往往難以了解電腦究竟是如何構成的……當我們面對“計算機”的時候,一定要時刻記得,你的“計算機”是台遵守存儲程式原理的馮諾依曼機器——運算器,控制器(這兩樣合起來是CPU),存儲器,輸入裝置,輸出裝置。你所面對的一切SOC也好單闆電腦也好,都是高度內建在一起的馮諾依曼機
現代的電腦雖然已經縮小了n多倍,性能強了n多倍,但它們和50年代的IBM機器在結構上是一樣的。思考題:試着找出上面和下面照片裡的運算器,控制器,存儲器,輸入裝置和輸出裝置。
要解釋什麼是檔案系統,要先解釋什麼是“檔案”(File),有時“檔案系統”也被翻譯為“檔案系統”。那麼這個“檔案”或“檔案”是什麼呢?看圖說話:
一摞打孔卡片,就是一個“檔案”它可以是一段程式,也可以是一段程式需要使用的資料。
上面的圖是一段Fortran Monitor System(monitor可以了解為原始的“作業系統”)的“作業”(job,批處理batch系統的術語,你可以了解為一個可執行的程式),包含起始卡片,程式邏輯,程式資料,結束卡片,其實和今天的可執行檔案的結構非常相似。
除了穿孔卡片之外,還有穿孔紙帶,你把一張一張卡片頭尾相接,就構成了一個(超寬的)紙帶。在邏輯上,它就是一個一維數組。
思考題:檔案讀取進來為什麼是byte array?
紙帶在70年代還很流行,當年比爾蓋茨的BASIC語言解釋器,就是存在紙帶上的,現在已經成文物了。
紙帶時代的遺産到現在還能在C語言裡看到,這段代碼來自:Read a file as byte array
FILE *fileptr;
char *buffer;
long filelen;
fileptr = fopen("myfile.txt", "rb"); // Open the file in binary mode
fseek(fileptr, 0, SEEK_END); // Jump to the end of the file
filelen = ftell(fileptr); // Get the current byte offset in the file
rewind(fileptr); // Jump back to the beginning of the file
buffer = (char *)malloc((filelen+1)*sizeof(char)); // Enough memory for file + \0
fread(buffer, filelen, 1, fileptr); // Read in the entire file
fclose(fileptr); // Close the file
fseek:快進,ftell:目前紙帶的位置,rewind:倒帶,filelen:紙帶的長度,你看到檔案操作的代碼,想着打孔紙帶卷來卷去,就形象了。錄音帶的原理和紙帶類似,但是用磁信号代替了實體打孔,記錄密度更高也更容耐用,還可以重新磁化擦除改寫。
不過紙帶也好錄音帶也好受制于實體結構都隻能線性讀寫,不能随機讀寫,如果你生活在1950年代,你會想到什麼?對了!黑膠唱機!
不對,是這個
此處該有音樂!Daft Punk: Random Access Memories
IBM 350“統計控制随機存取法”(Random Access Method of Accounting and Control)使用了50張磁性“唱片”和機械手臂控制的“唱針”(磁頭)
後來,人們為了紀念IBM 350對計算機工業的巨大啟發,為它樹立了巨大的紀念性建築——Oracle總部
思考題:資料庫圖示的圓柱是什麼?
上面的IBM 350有5MB,磁盤在當時屬于容量很大的存儲器,能夠存儲許多許多穿孔卡片和紙帶的資料了,是以就必須對磁盤進行索引,1964年的檔案 Disc File Applications: Reports Presented at the Nation's First Disc File Symposium 《磁盤檔案應用:遞交給第一屆磁盤檔案研讨會的報告》展示了1960年代主要的若幹電腦系統對磁盤的使用。
http://www.bitsavers.org/pdf/informatics/Disc_File_Applications_1964.pdf
其中的插圖展示了硬碟“格式化”的概念,将磁盤劃分為若幹較小的塊,友善檢索和操作。
看圖說話:磁盤分區軟體的“柱面”是什麼?
Bryant 4000是一款容量和體積都非常巨大的硬碟,直徑1米的大圓盤以1200轉每分的速度運作,充滿了機械美學。
http://s3data.computerhistory.org/brochures/bryant.model2.1965.102646212.pdf
檔案系統解決的問題,就是如何在磁盤上定位和索引檔案的問題——怎麼在大轉盤裡找到自己想要的那卷紙帶,像這樣。
早期的檔案系統是扁平的,沒有檔案層次(hierarchy)的概念,Linux的前身Unix的前身Multics——爸爸的爸爸叫爺爺,總之,Linux的“爺爺”在1965年的時候成為第一個有檔案層次的系統。當年的論文我們還能看到。
A General-Purpose File System For Secondary Storage
設計檔案層次系統所要解決的問題,是多程式(multiprogramming)環境下的次要(Secondary)線上存儲器的可用問題(主要存儲器用來加載系統,不放使用者程式和資料),利用樹狀檔案系統和權限管理,可以實作程式和使用者一定程度上的隔離,提升分時系統的可用性,其中CHANGEDIRECTORY指令的簡寫cd指令直到今天仍然是幾乎所有指令行系統中都最為常用的指令之一。
CHANGEDIRECTORY PATHNAME
1970年代,Linux的“爸爸”Unix設計的時候,人們對電腦的應用更加豐富,許多新的需求被提出來,比如
- 如何讓不同的程式交流資料?
- 如何讓程式友善的操作不同外設?
- 如何利用腳本實作複雜的工作流程?
這些需求帶來了Unix系統最為重要的特征——統一的檔案系統和管道,Unix的檔案包括三類:
- 普通的檔案
- 目錄
- 特殊檔案——輸入輸出裝置
此外Unix還設計了三個獨特的檔案系統機制
- 可移動的檔案系統
- 10bit權限保護系統
- 統一的輸入輸出調用
為什麼要設計可移動(挂載)的檔案系統,因為我們有移動硬碟了呀,decpack了解一下,把磁盤挂載到電腦上有幾個步驟?把硬碟放進洗衣機(驅動器)裡,關上洗衣機門,開動洗衣機,然後mount,就可以用了。反之停掉“洗衣機”之前,要umount(unmount,解除安裝),才能保證沒有程式占用硬碟。
思考題:圖中的妹子在幹什麼?
1978年發表的《The UNIX Time-Sharing System》一文,介紹的就是Unix運作在上面圖中同款的PDP-11電腦上的情況,也介紹了Unix檔案系統的設計需求和基本概念
https://archive.org/details/bstj57-6-1905
Unix提供了統一的裝置檔案,抹平了不同類型的輸入輸出裝置的差異,你可以把一個檔案輸出到序列槽,也可以把它輸出到列印機,還可以把它存儲到硬碟或者錄音帶上,而程式可以完全不用改,隻要重定向輸出裝置就好,簡直太友善了有木有,這些特性一直沿用到今天。
Device file - Wikipedia
Linux在設計時就是為了盡可能和Unix相容,是以保留了幾乎全部的Unix特性,雖然基于NAND的閃存開始在很多領域取代硬碟,巨大的CPU也被微處理器廣泛替代,但對于Linux軟體來說,它們面對的API仍然是一部抽象了的PDP小型機。
RAM disk出現的比較晚,1980年出現在運作在CP/M的微機上,之後也出現在DOS上,用軟體機制模拟了一張磁盤來提供高速的臨時存儲空間,資料确實不是持久的,它的作用一般隻是用來放臨時資料,減少低速磁盤的讀寫次數,提高軟體運作速度。