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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...