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
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...