1. 程式人生 > 其它 >xv6 lec3 OS Organization and System Calls

xv6 lec3 OS Organization and System Calls

3.1 上一節課回顧

  • 作業系統的基本架構是,os之上時shell,echo,find等使用者態程式;中間是os,為使用者程式提供服務與管理;os之下時硬體,os為上層應用提供unix風格的介面,使得硬體變成了簡單的抽象

3.2 作業系統隔離性(isolation)

  • 稻草人提案法(就是頭腦風暴找出錯誤)
  • 作業系統提供的虛擬記憶體,程序切換(程序抽象了CPU,OS不是直接提供CPU給應用程式,而是項應用程式提供程序)提供了隔離性。
  • exec抽象了記憶體,當我們在執行exec系統呼叫的時候,我們會傳入一個檔名,而這個檔名對應了一個應用程式的記憶體映象。記憶體映象裡面包括了程式對應的指令,全域性的資料。
  • file抽象了磁碟

3.3 作業系統防禦性(Defensive)

  • os的防禦性是指其,能夠應對惡意的應用程式
  • 通過硬體實現強隔離性,第一是user/kernel mode(kernel mode在RISC-V被稱為Supervisor mode),第二是page table/虛擬記憶體
  • 如果需要執行能夠支援多個應用程式的作業系統,需要同時支援user/kernel mode和虛擬記憶體

3.4 硬體對於強隔離的支援

  • 在RISC-V還有第三種模式,叫做machine mode

3.5 User/Kernel mode切換

  • C語言對於底層硬體的控制能力更好

3.6 巨集核心 vs 微核心 (Monolithic Kernel vs Micro Kernel)

  • 核心是可信任的計算空間(Trusted Computing Base)TCB。
  • 巨集核心是指所有的作業系統服務都在kernel mode中。巨集核心的好處是可以將檔案系統,虛擬記憶體,程序管理等子模組緊密的整合在一起,效能好。但是,龐大的核心由於程式碼量大,容易出錯,如果需要執行大量核心計算程式,適合桌面作業系統,比如windows,伺服器作業系統,linux
  • 微核心是指將作業系統的大多數部分執行在核心之外。微核心程式碼量小,bug少,但是效能低,比如這裡的IPC通訊,需要兩次使用者/核心態之間的切換,適合minix,cell這種嵌入式作業系統

3.7 編譯執行kernel

  • 在xv6中,所有的kernel資料夾下的檔案會被編譯成一個二進位制檔案,然後這個二進位制檔案會被執行在kernel mode。user資料夾類似
    mkfs是一個檔案映象?
  • fs.img磁碟驅動?

3.8 QEMU

  • 對於硬體程式設計(比如對於UART裝置),就是對其暫存器完成 memory mapped I/O,之後複用普通的load/store指令去讀寫硬體裝置的控制暫存器,進而去控制裝置。
  • qemu模擬了RISC-V處理器,它做了三件事:1.讀取4位元組或者8位元組的RISC-V指令 2.解析RISC-V指令 3.軟體去執行相應的指令; 對於每一個CPU核,qemu都會去執行一個迴圈

3.9 XV6 啟動過程

  • qemu內部有一個gdb server?
  • 可以把核心的執行看成一個可執行檔案,設定完斷點後,執行沒有停在斷點處?
  • kernel.ld定義了核心如何被載入,一開始執行核心程式碼的時候處於machine mode,沒有記憶體分頁,沒有隔離性
  • userinit函式有點像是膠水程式碼(膠水程式碼不實現具體的功能,只是為了適配不同的部分而存在),在userinit函式中分配了第一個程序並執行了一段initcode對應與這段彙編,但是為什麼普通的系統呼叫不需要la a0, initla a1, argv這段initcode彙編又會去通過exec系統呼叫執行init程式其中主要就是設定console之類的,之後還會fork子程序,並在子程序中執行shell,shell同樣是通過exec系統呼叫實現的