磁碟檔案系統是一種設計用來利用資料儲存裝置來儲存計算機檔案的檔案系統,最
常用的資料儲存裝置是磁碟驅動器,可以直接或者間接地連線到計算機上。
與此相對的是眾多微核心中使用的使用者空間檔案系統,其特點是檔案系統在使用者空間中實現,通過特殊的系統呼叫介面或者通用機制為其他使用者程式提供服務。
整個檔案系統包括以下幾個部分:
外部儲存裝置驅動通常,外部裝置的操作需要通過按照一定操作序列讀寫特定的暫存器來實現。為了將這種操作轉化為具有通用、明確語義的介面,我們必須實現相應的驅動程式。在本部分,我們實現了 ide 磁碟的使用者態驅動程式。
檔案系統結構在本部分,我們實現磁碟上和作業系統中的檔案系統結構,並通過驅動程式實現檔案系統操作相關函式。
檔案系統的使用者介面在本部分,我們提供介面和機制使得使用者程式能夠使用檔案系統,這主要通過乙個使用者態的檔案系統服務來實現。同時,我們引入了檔案描述符等結構使作業系統和使用者程式可以抽象地操作檔案而忽略其實際的物理表示。
mips 的位址空間中,其在核心位址空間中(kseg0 和 kseg1段)實現了硬體級別的實體地址和核心虛擬位址的轉換機制。由於我們在模擬器上執行作業系統,i/o 裝置的實體地址是完全固定的。這樣一來我們的驅動程式任務就轉變成了簡單的讀寫某些固定的核心虛擬位址。
我們使用 c 語言程式(fs/fsformat.c)來模擬對磁碟的操作,掌握如何將檔案和資料夾按照檔案系統的格式寫入磁碟,我們也正是通過 fsformat 程式來建立乙個磁碟檔案 fs/fs.img 供核心使用。
塊快取指的是借助虛擬記憶體來實現磁碟塊快取的設計。read_block 函式將指定編號的磁碟塊都入到記憶體中,首先檢查這塊磁碟塊是否已經在記憶體中,如果不在,先分配一頁物理記憶體,然後呼叫 ide_read 函式來讀取磁碟上的資料到對應的虛存位址處。
檔案系統屬於使用者態程序,以服務的形式供其他程序呼叫。這個過程中,不僅涉及了不同程序之間通訊的問題,也涉及了檔案系統如何隔離底層的檔案系統實現,抽象地表示乙個檔案的問題。
當使用者程序向檔案系統傳送開啟檔案的請求時,檔案系統程序會將這些基本資訊記錄在記憶體中,然後由作業系統將使用者程序請求的位址對映到同乙個物理頁上,因此乙個檔案描述符至少需要獨佔一頁的空間。當使用者程序獲取了檔案大小等基本資訊後,再次向檔案系統傳送請求將檔案內容對映到指定記憶體空間中。
檔案和目錄邏輯上都是由一系列資料塊構成,可以像程序那樣將虛擬位址空間對映到物理記憶體,檔案系統需要隱藏資料塊分布細節,對外只需要提供檔案操作方法即可,如open,read,write,close等。我們的檔案系統它沒有使用系統呼叫實現,而是通過我們之前完成的ipc功能來實現檔案操作的。系統會在啟動時執行乙個檔案系統程序,該程序接收使用者程序的ipc請求並完成檔案的各種操作。
在init/init.c
裡面,我們建立了兩個程序。其中乙個呼叫了umain/serv.c
void
umain
(void
)
下面以fstest的兩個語句為例,梳理一下思路。
if
((r =
open
("/newmotd"
, o_rdwr)
)<0)
fdnum = r;
writef
("open is good\n");
if((n =
read
(fdnum, buf,
511)
)<0)
1. 呼叫serve_init/serv.c
進行opentab的初始化。
void
serve_init
(void
)}
opentab裡管理的是開啟的檔案,其定義為
struct open
;struct open opentab[maxopen]=}
;
在賦值opentab[0]的前三個成員,第乙個是位址。o_mode開啟方式
2.fs_init/fs.c
void
fs_init
(void
)
這幾個函式的用處大概能從名字看出來。
read_super()
struct super
;
struct super *super;
super是乙個super型別的結構體指標,它既可以表示位址(即block1所在記憶體的虛擬位址),也可以作為結構體指標訪問結構體裡的資料。
block讀到記憶體主要是靠以下的函式,把磁碟指定位置的內容讀進目標虛擬位址。
ide_read(0
, blockno * sect2blk,
(void
*)va, sect2blk)
;
check_write_block()
test that write_block works, by smashing the superblock and reading it back.
就是把它解綁以後看看變化,再綁回去。
read_bitmap()
建立bitmap,把相應大小的bitmap從block讀入記憶體
3.fs_test
作業系統lab5
檔案系統 實驗報告 實驗簡介 本實驗要求在假設的i o系統之上開發乙個簡單的檔案系統,這樣做既能讓實驗者對檔案系統有整體了解,又避免了涉及過多細節。使用者通過create open read等命令與檔案系統互動。檔案系統把磁碟視為順序編號的邏輯塊序列,邏輯塊的編號為0至l 1。i o系統利用記憶體中...
作業系統實驗課程 Lab1
lab1 bootloader interrupt device driver 啟動作業系統的bootloader,了解作業系統啟動前的狀態和要做的準備工作,了解執行作業系統的硬體支援,作業系統如何載入到記憶體中,理解兩類中斷 外設中斷 陷阱中斷 等 1.基於分段機制的儲存管理 2.裝置管理的基本概...
作業系統lab2實驗總結 Part2
沒有做出lab2 2 extra,後來發現其實是理論課的原題,甚至是我做過的。反思了一下,自己對於有些模糊的知識得過且過了,或者說只能夠做出一種題,沒有深刻明白它的原理,希望引以為戒。以前我對自對映的理解就是,有乙個4kb的頁目錄放進了4mb二級頁表中的乙個頁表中。現在發現有一些需要注意的問題 二級...