MIT6.S081 - Lecture3: OS Organization and System Calls

来源:https://www.cnblogs.com/jll133688/p/18147464
-Advertisement-
Play Games

為什麼要使用操作系統 使用操作系統的主要原因是為了實現 CPU 多進程分時復用以及記憶體隔離 如果沒有操作系統,應用程式會直接與硬體進行交互,這時應用程式會直接使用 CPU,比如假設只有一個 CPU 核,一個應用程式在這個 CPU 核上運行,但是同時其他程式也需要運行,因為沒有操作系統來幫助切換,就需 ...


為什麼要使用操作系統

  1. 使用操作系統的主要原因是為了實現 CPU 多進程分時復用以及記憶體隔離
  2. 如果沒有操作系統,應用程式會直接與硬體進行交互,這時應用程式會直接使用 CPU,比如假設只有一個 CPU 核,一個應用程式在這個 CPU 核上運行,但是同時其他程式也需要運行,因為沒有操作系統來幫助切換,就需要應用程式時不時釋放 CPU 資源,但是如果這個程式的某個函數有一個死迴圈,那它就永遠也不會釋放 CPU,甚至沒辦法做到運行第三方程式來停止或者殺死這個死迴圈程式,這種情況下就沒辦法實現 CPU 多進程的分時復用
  3. 還有從記憶體的角度來看,如果應用程式直接運行在硬體上,則程式的數據代碼都直接保存到物理記憶體中,這樣不同程式的記憶體之間沒有明確邊界,就可能會造成一個程式存儲在本來屬於另外一個程式的記憶體空間,覆蓋另外一個程式中的內容

操作系統的隔離性需要隔離用戶程式和操作系統,也需要隔離不同的進程

系統調用與隔離性

  • 可以認為 exec 抽象了記憶體。當我們在執行 exec 系統調用的時候,我們會傳入一個文件名,而這個文件名對應了一個應用程式的記憶體鏡像。記憶體鏡像裡面包括了程式對應的指令,全局的數據。應用程式可以逐漸擴展自己的記憶體,但是應用程式並沒有直接訪問物理記憶體的許可權,例如應用程式不能直接訪問物理記憶體的 1000-2000 這段地址。不能直接訪問的原因是,操作系統會提供記憶體隔離並控制記憶體,操作系統會在應用程式和硬體資源之間提供一個中間層。exec 是這樣一種系統調用,它表明瞭應用程式不能直接訪問物理記憶體。
  • files 基本上是抽象了磁碟。應用程式不會直接讀取磁碟,在 Unix 中它與存儲系統交互的唯一方式就是通過 files。操作系統會決定如何將文件與磁碟中的塊對應,確保一個磁碟塊只出現在一個文件中,並保證用戶 A 不能操作用戶 B 的文件。files 實現了不同用戶之間以及同一用戶不同進程之間的文件隔離

硬體實現強隔離性

實現強隔離性的硬體支持包括了兩部分:

  1. user/kernel mode:處理器有兩種操作模式:user mode 和 kernel mode:

    • 當運行在 kernel model 時,CPU 能運行特定許可權的指令(直接操作硬體的指令和設置保護的指令,如設置 page table 寄存器、關閉時鐘中斷)
    • 當運行在 user mode 時,CPU 只能運行普通許可權的指令

    RISC-V 實際上有三種許可權:user/kernel/machine mode

  2. 在 RISC-V 中,如果你在用戶空間(user space)嘗試執行一條特殊許可權指令,用戶程式會通過系統調用來切換到 kernel mode。當用戶程式執行系統調用,會通過 ECALL 觸發一個軟中斷(software interrupt),軟中斷會查詢操作系統預先設定的中斷向量表,並執行中斷向量表中包含的中斷處理程式。中斷處理程式在內核中,這樣就完成了 user mode 到 kernel mode 的切換,並執行用戶程式想要執行的特殊許可權指令

  3. 虛擬記憶體:每個進程都有自己獨立的 page table,page table 將虛擬記憶體地址和物理記憶體地址做了對應

ECALL 指令

  • 在 RISC-V 中,ECALL 指令可以讓用戶程式將控制權轉移給內核,並傳入一個數字,這個數字表示了應用程式想要調用的 System Call
  • ECALL 會跳轉到內核中一個特定的位置,在內核側,有一個位於 syscall.c 的函數 syscall,每一個從應用程式發起的系統調用都會調用到這個 syscall 函數,syscall 函數會檢查 ECALL 的參數

內核是如何奪回控制權

  • 內核會通過硬體設置一個定時器,定時器到期之後會將控制許可權從用戶空間轉移到內核空間,之後內核就有了控制能力並可以重新調度 CPU 到另一個進程中

巨集內核 vs 微內核

巨集內核

XV6 中,所有的操作系統服務都在 kernel mode 中,這種形式被稱為巨集內核

  • 從安全的角度來說,這種方式不太好,在一個巨集內核中,任何一個操作系統的 Bug 都有可能成為漏洞,如果有許多行代碼運行在內核中,那麼出現嚴重 Bug 的可能性也變得更大
  • 巨集內核的優勢在於可以將文件系統、虛擬記憶體、進程管理這些實現特定功能的子模塊緊密地集成在一起,這樣可以提供很好的性能

微內核

微內核模式下,在內核中只有非常少的模塊,將內核中的其他部分作為普通的用戶程式來運行

  • 這樣做的好處是內核中的代碼數量較小,降低了 bug 出現的可能
  • 如果用戶程式想要使用內核的功能,但由於內核的程式作為普通的用戶程式,比如說某個系統想要使用文件系統,需要完成從用戶空間到內核空間,再從內核到用戶空間來訪問文件系統,文件系統也需要經過同樣的路徑將消息返回給用戶系統,使得在微內核從用戶到內核的跳轉是巨集內核的兩倍,而反覆跳轉帶來了性能的損耗,且微內核的內核程式被隔離開,難以實現共用,降低了系統的性能。

XV6 代碼結構

代碼主要由三部分組成:

  1. kernel:包含了基本上所有的內核文件
  2. user:這基本上是運行在 user mode 的程式
  3. mkfs:會創建一個空的文件鏡像,將這個鏡像存在磁碟上,就可以直接使用一個空的文件系統

kernel 編譯過程

  1. Makefile 讀取一個 C 文件,比如 proc.c,然後調用 gcc 編譯器,生成一個叫 proc.s 的文件,這是 RISC-V 彙編語言文件,然後再走到彙編解釋器,生成 proc.o,這是彙編語言的二進位格式,Makefile 會為所有內核文件做相同的操作
  2. 系統載入器收集所有的.o 文件,將它們鏈接在一起並生成內核文件

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 順序表 題目一: 題目分析: 該題目需要先對順序表進行遍歷至元素x正確插入位置,再對順序表完成插入操作。因此涉及到for迴圈與if語句的使用 代碼實現 /******************************************************************** * * ...
  • 1:在離線的環境中導入鏡像 在無法訪問外網的情況下,通過將docker鏡像導出為一個包,然後導入到另外的一臺電腦上面,從而實現了不用訪問外網就能拉取鏡像了 #將鏡像輸出到這個tar包 [root@cleint ~]# docker save -o centos.tar centos #通過第三方的 ...
  • 2.1.1 命令提示符 在CentOS 7操作系統中,Linux命令提示符就像是你與電腦交流的一個小標誌,告訴你系統已經準備好接受你的指令了。 它通常會顯示在你打開的終端視窗或控制台的最前面。 讓我們來看一個示例: [root@node01 ~]$ 在這個示例中: root:是當前登錄的用戶名。 @ ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是在i.MXRT1xxx系列上用NAND型啟動設備時可用兩級設計縮短啟動時間。 去年痞子衡寫過一篇騷操作文章 《藉助i.MXRT10xx系列INIT_VTOR功能可以縮短程式熱重啟時間》,這對於 NAND 型啟動設備上程式熱重啟時間的縮短 ...
  • 聲明: 以下內容為個人筆記,內容不完全正確,請謹慎參考。 正則表達式 含義: 正則表達式使用的每個單獨字元串來描述、匹配一些列符合語法規則的字元串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。在Linux中,grep,sed,awk等文本處理工具都支持正則表達式進行模式 ...
  • 在上一篇中,老周用 .NET Nano Framework 給大伙伴們演示了 WS2812 燈帶的控制,包括用 SPI 和 紅外RMT 的方式。利用 RMT 是一個很機靈的方案,不過,可能很多大伙伴對 ESP32 的 RMT 不是很熟悉。除了樂鑫自己的文檔,沒幾個人寫過相關的水文,可見這裡頭空白的水 ...
  • 聲明: 以下為個人筆記,內容不完全正確,請謹慎參考。 while迴圈 while迴圈結構 while [條件判斷] do 程式 done 腳本示例: 點擊查看代碼 #!/bin/bash while [ $a -le $1] do sum=$[ $sum + $a ] done echo $sum ...
  • /******************************************************************************************************** * * 提高可移植性 Copyright (c) 2023-2024 cececlmx@ ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...