MIT 6 828 xv6學習筆記 0

2021-08-25 16:39:06 字數 2964 閱讀 9216

vx6是mit開發的教學用的小型作業系統,是unix version 6(v6)的重新實現,這個筆記會摘抄xv6中文文件(以下簡稱「文件」)的內容,同時結合一些自己的看法,文章遵循文件中的順序。

1)在文件中,這樣定義作業系統的作用:

作業系統的工作是(1)將計算機的資源在多個程式間共享,並且給程式提供一系列比硬體本身更有用的服務。(2)管理並抽象底層硬體,舉例來說,乙個文字處理軟體(比如 word)不用去關心自己使用的是何種硬碟。(3)多路復用硬體,使得多個程式可以(至少看起來是)同時執行的。(4)最後,給程式間提供一種受控的互動方式,使得程式之間可以共享資料、共同工作。

2)關於檔案描述符:

檔案描述符是乙個整數,它代表了乙個程序可以讀寫的被核心管理的物件。程序可以通過多種方式獲得乙個檔案描述符,如開啟檔案、目錄、裝置,或者建立乙個管道(pipe),或者複製已經存在的檔案描述符。簡單起見,我們常常把檔案描述符指向的物件稱為「檔案」。檔案描述符的介面是對檔案、管道、裝置等的抽象,這種抽象使得它們看上去就是位元組流。

檔案描述符提供了檔案之上的一層巧妙的抽象,有了檔案描述符,只需要關心檔案的作用(如標準輸入輸入),而不需要關心具體是什麼檔案,這樣就為重定向等功能提供了方便。

3)什麼是鏈結(link)

系統呼叫link建立另乙個檔案系統的名稱,它指向同乙個inode。下面的**建立了乙個既叫做a又叫做b的新檔案。

open("a", o_create|o_wrongly);

link("a", "b");

讀寫 a 就相當於讀寫 b。

struct stat ;
同樣,unlink函式從檔案系統移除乙個檔名,nlink減1。當乙個檔案的nlink為0時,該檔案被從磁碟刪除。否則即使執行unlink("a"),還是可以通過b訪問該檔案。

4)管道

在文件中對管道的解釋十分清楚,在此直接摘抄:

管道是乙個小的核心緩衝區,它以檔案描述符對的形式提供給程序,乙個用於寫操作,乙個用於讀操作。從管道的一端寫的資料可以從管道的另一端讀取。管道提供了一種程序間互動的方式。

接下來的示例**執行了程式wc,它的標準輸出繫結到了乙個管道的讀埠。

int p[2];

char *argv[2];

argv[0] = "wc";

argv[1] = 0;

pipe(p);

if(fork() == 0) else

這段程式呼叫pipe,建立乙個新的管道並且將讀寫描述符記錄在陣列p中。在fork之後,父程序和子程序都有了指向管道的檔案描述符。子程序將管道的讀埠拷貝在描述符0上,關閉p中的描述符,然後執行wc。當wc從標準輸入讀取時,它實際上是從管道讀取的。父程序向管道的寫埠寫入然後關閉它的兩個檔案描述符。

如果資料沒有準備好,那麼對管道執行的read會一直等待,直到有資料了或者其他繫結在這個管道寫埠的描述符都已經關閉了。在後一種情況中,read會返回 0,就像是乙份檔案讀到了最後。讀操作會一直阻塞直到不可能再有新資料到來了,這就是為什麼我們在執行wc之前要關閉子程序的寫埠。如果wc指向了乙個管道的寫埠,那麼wc就永遠看不到 eof 了。

xv6 shell 對管道的實現(比如fork sh.c | wc -l)和上面的描述是類似的(7950行)。子程序建立乙個管道連線管道的左右兩端。然後它為管道左右兩端都呼叫runcmd,然後通過兩次wait等待左右兩端結束。管道右端可能也是乙個帶有管道的指令,如a | b | c, 它fork兩個新的子程序(乙個b乙個c),因此,shell 可能建立出一顆程序樹。樹的葉子節點是命令,中間節點是程序,它們會等待左子和右子執行結束。理論上,你可以讓中間節點都執行在管道的左端,但做的如此精確會使得實現變得複雜。

pipe 可能看上去和臨時檔案沒有什麼兩樣:命令

echo hello world | wc

可以用無管道的方式實現:

echo hello world > /tmp/xyz; wc < /tmp/xyz

但管道和臨時檔案起碼有三個關鍵的不同點。首先,管道會進行自我清掃,如果是 shell 重定向的話,我們必須要在任務完成後刪除/tmp/xyz。第二,管道可以傳輸任意長度的資料。第三,管道允許同步:兩個程序可以使用一對管道來進行二者之間的資訊傳遞,每乙個讀操作都阻塞呼叫程序,直到另乙個程序用write完成資料的傳送。

5)關於shell的執行機制:

shell在死迴圈中呼叫getcmd()來獲取使用者輸入的命令,讀取到命令之後,fork乙個子程序,並在子程序中執行runcmd(),runcmd()根據傳入的引數用exec()函式在該子程序中載入命令對應的程式,待執行結束後子程序退出,期間父程序一直等待(父程序執行wait()),直到子程序結束。

然而cd函式不能用這種機制執行,原因如下:

cd 必須改變 shell 自身的當前工作目錄。如果 cd 作為乙個普通命令執行,那麼 shell 就會 fork 乙個子程序,而子程序會執行 cd,cd 只會改變子程序的當前工作目錄。父程序的工作目錄保持原樣。

因此cd在父程序中實現,而非子程序。

1. xv6 中文文件

mit 6 828學習筆記0 搭建環境

注 由於實驗室的同學用的18年的課,我也就用的18年 ubuntu 18.04.5 使用的是清華園的映象 qemu 參見官網教程 這一步參考的部落格 如果不成功的話,參考官方文件即可 即可如果直接 sudo apt get install python2.7會出現依賴問題 解決辦法為 sudo ap...

Xv6 chapter 0 學習筆記

xv 6 chapter 0 operating system inte ces 作業系統的工作是分享電腦資源給多個程式,並且提供一系列服務而不是只讓硬體提供。作業系統通過介面給使用者程式提供服務,所以設計乙個好的介面就顯得很重要。這裡作業系統xv6提供基礎的介面,由ken thompson 和de...

關於學習MIT6 828作業系統課程的記錄

課程描述 6.828傳授關於作業系統的基本知識。下面的主題將會在本課程中具體學到 virtual memory,kernel and user mode,system calls,threads,context switches,interrupts,interprocess communicati...