日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

xv6book阅读 chapter2

發布時間:2024/1/16 windows 52 coder
生活随笔 收集整理的這篇文章主要介紹了 xv6book阅读 chapter2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一個操作系統至少應該滿足三個需求:多路復用、隔離、交互。本章主要介紹如何組織操作系統來實現以上的三個需求,本文關注的是一種圍繞單核進行設計的方法,這種設計是被許多uinx操作系統所使用的。Xv6運行在多核RISC-V微處理器上時,它的許多低級功能(例如,它的進程實現)是特定于RISC-V的,RISC-V是一個64位的處理器,而xv6是用“LP64”C語言編寫的,這意味著C編程語言中的長(L)和指針(P)是64位,而int是32位,這里順便復習一下指針的大小是和機器有關的,比如64位機器中指針大小就是8字節。xv6是為qemu的“-machine virt”選項模擬的支持硬件編寫的。這包括RAM、包含引導代碼的ROM、與用戶鍵盤/屏幕的串行連接以及用于存儲的磁盤,而qemu所模擬的環境是單個CPU內核

1 抽象物理資源

為什么要有操作系統?操作系統可以做為一個系統調用的庫,被所有運行在里面的程序所鏈接,而程序可以通過操作系統更好的使用硬件資源。通常進程總是會有bug并且不能很好的信任彼此,因此需要很好的隔離性。隔離性不僅僅指進程之間,還有進程與資源,進程與操作系統。

為了實現強隔離,禁止應用程序直接訪問敏感的硬件資源,將資源抽象到服務中,是一種很好的方法。例如,Unix應用程序僅通過文件系統的open、read、write和close系統調用與存儲交互,而不是直接讀寫磁盤。這樣一來,操作系統才是真正的資源管理者,而不是用戶。

2 用戶模式、管理者模式以及系統調用

強隔離要求應用程序和操作系統之間有一個硬邊界。如果應用程序出錯,我們不希望操作系統失敗,也不希望其他應用程序失敗。操作系統應該能夠清理失敗的應用程序并繼續運行其他應用程序。為了實現強隔離,操作系統必須安排應用程序不能修改(甚至讀取)操作系統的數據結構和指令,并且應用程序的指令不能訪問其他進程的內存。這里其實就開始引出為什么要有用戶態和內核態了。

cpu為強隔離提供硬件支持。例如,RISC-V有三種CPU執行指令的模式:機器模式、管理者模式和用戶模式。在機器模式下執行的指令具有完全權限;CPU以機器模式啟動。機器模式主要用于配置計算機。Xv6在機器模式下執行幾行代碼,然后切換到管理者模式。

在管理者模式下,CPU被允許執行特權指令:例如,啟用和禁用中斷,讀取和寫入保存頁表地址的寄存器,等等。如果用戶模式下的應用程序試圖執行特權指令,則CPU不會執行該指令,而是切換到管理者模式,以便管理者模式代碼可以終止應用程序,因為它做了一些不應該做的事情。應用程序只能執行用戶模式指令(例如,添加數字等),被稱為在用戶空間中運行,而處于管理者模式的軟件也可以執行特權指令,被稱為在內核空間中運行。在內核空間(或在管理器模式下)運行的軟件稱為內核。

上述三種模式是針對于CPU的,對于程序而言,它所執行的環境可以分為用戶態和內核態,對應著CPU的用戶模式和管理者模式。一個想要調用內核函數的應用程序(例如,在xv6中讀取系統調用)必須轉換到內核態。CPU通常會提供一個特殊的指令,可以將CPU從用戶模式切換到管理模式,并在內核指定的入口點進入內核。(RISC-V為此目的提供了調用指令ecall)。

一旦CPU切換到管理者模式,內核就可以驗證系統調用的參數(例如,檢查傳遞給系統調用的地址是否屬于應用程序內存的一部分),決定是否允許應用程序執行請求的操作(例如,檢查是否允許應用程序寫入指定的文件),然后拒絕它或執行它。重要的是,內核會控制過渡到管理器模式的入口點,否則惡意程序也可以隨意進入內核態

3 內核架構

一個關鍵的設計問題是操作系統的哪個部分應該在管理者模式下運行。一種實現是整個操作系統駐留在內核中,因此所有系統調用的實現都以管理者模式運行。這種組織稱為宏內核(a monolithic kernel)。

在這種組織中,整個操作系統以完全硬件特權運行。這種組織很方便,因為操作系統設計者不必決定操作系統的哪一部分不需要完全的硬件特權。此外,操作系統的不同部分更容易協作。例如,一個操作系統可能有一個緩沖緩存,它可以被文件系統和虛擬內存系統共享。

但宏內核的缺點就是操作系統中不同部分之間的接口設計很復雜,并且宏內核中產生的任何一個錯誤都是致命的,因為管理者模式中的錯誤通常都會導致cpu運行失敗,這個時候必須重啟才行。

為了減少在內核中出錯的風險,操作系統設計者可以盡量減少在管理者模式下運行的操作系統代碼的數量,并在用戶模式下執行大部分操作系統。這種內核組織稱為微內核

在圖中,文件系統作為用戶級進程運行。作為進程運行的操作系統服務稱為服務器。為了允許應用程序與文件服務器交互,內核提供了一個進程間通信機制,將消息從一個用戶模式進程發送到另一個用戶模式進程。例如,如果像shell這樣的應用程序想要讀取或寫入文件,它會向文件服務器發送消息并等待響應。

但無論是微內核還是宏內核,都是有很多相似的設計思想,比如它們都會有系統調用,處理中斷、支持進程,支持鎖,實現文件系統等。Xv6是作為一個宏內核實現的,因此,xv6內核接口對應于操作系統接口,內核實現完整的操作系統。

4 內核的文件組織

xv6內核源代碼位于“kernel/”子目錄下。源代碼按照模塊化的方式粗略劃分為多個文件,如下圖所示,模塊間的接口定義在kernel/defs.h中

5 進程概述

進程是xv6內核中最小的隔離單位,內核用來實現進程的機制包括用戶/主管模式標志、地址空間和線程的時間切片。Xv6使用頁表(由硬件實現)為每個進程提供自己的地址空間。RISC-V頁表轉換(或“映射”)一個虛擬地址(RISC-V指令操作)到一個物理地址(CPU芯片發送到主存的地址)。

xv6為每個進程維護一個單獨的頁表,用于定義該進程的地址空間。地址空間包括從虛擬地址0開始的進程用戶內存,如下圖所示。首先是指令,然后是全局變量,然后是堆棧,最上面有兩個特殊的區域trapframe和trampoline,這里對其分別解釋一下:
1.trapframe:

  • trapframe是一個數據結構,用于保存處理中斷或異常時 CPU 寄存器的狀態。它記錄了中斷或異常發生時,CPU 寄存器的值,以及一些其他與處理中斷相關的信息。以便在中斷服務例程(interrupt service routine,ISR)執行完畢后,能夠正確地恢復進程的執行。
  • trapframe 中的信息可能包括程序計數器(PC)、堆棧指針(SP)、標志寄存器(FLAGS)、各種段寄存器等。

2.trampoline:

  • trampoline是一段代碼,通常是匯編代碼,用于在用戶態和內核態之間進行切換。當中斷或異常發生時,CPU 需要從用戶態切換到內核態,執行內核中對應的中斷服務例程。trampoline 代碼的作用是協助這個切換過程。
  • 在 xv6 中,trampoline 代碼的一部分被放置在用戶地址空間中,以便在用戶程序發生中斷時,能夠正確地切換到內核態執行中斷服務例程。

RSIC-V處理器上的指針是64位的,但在頁表中查找虛擬地址的時候,硬件只使用低39位,因此進程空間的最大地址只能是2^38-1,對于最大地址空間的宏定義為MAXVA(kernel/riscv.h:363)

xv6內核為每個進程維護一個proc結構體,用于保存進程的一些狀態信息
(kernel/proc.h:86)。進程最重要的內核狀態信息是他的頁表、堆棧和運行狀態。可以使用p->xxx來指代proc結構體的元素,如p->pagetable是指向進程頁表的指針。

每個進程都有一個用于執行指令的上下文。這個上下文包括進程的寄存器狀態、程序計數器(PC)以及其他與執行指令相關的信息。每個進程都在自己的地址空間中執行,有獨立的寄存器狀態和代碼空間。而xv6book中所指的執行線程可以理解為上下文中可以執行指令的組成部分。每個進程有兩個堆棧:用戶堆棧和內核堆棧(p->kstack)。當進程執行用戶指令時,只有它的用戶堆棧在使用,而它的內核堆棧是空的。當進程進入內核時(對于系統調用或中斷),內核代碼在進程的內核堆棧上執行;當進程處于內核中時,它的用戶堆棧仍然包含保存的數據,但是沒有被積極使用。進程的線程在主動使用其用戶堆棧和內核堆棧之間交替。內核堆棧是獨立的(并且不受用戶代碼的影響),因此即使進程破壞了它的用戶堆棧,內核也可以執行。

進程可以通過執行RISC-V調用指令來進行系統調用。該指令提高硬件特權級別,并將程序計數器更改為內核定義的入口點。入口點的代碼切換到內核堆棧,并執行實現系統調用的內核指令。當系統調用完成時,內核切換回用戶堆棧,并通過調用sret指令返回到用戶空間,這降低了硬件特權級別,并在系統調用指令之后恢復執行用戶指令。進程的執行線程可以在內核中“阻塞”以等待I/O,并在I/O完成后恢復到它離開的地方。

p->state用于指示線程是在運行態、就緒態還是阻塞態,p->pagetable指示進程的頁表,當在用戶空間中執行進程時,xv6的分頁硬件會使用該頁表。而一個進程的頁表不僅用于映射虛擬地址到物理地址,同時也記錄了分配給該進程存儲內存的物理頁面的地址。

總而言之,一個進程捆綁了兩個設計思想:一個地址空間,給進程一個自己內存的錯覺;一個執行線程,給進程一個自己CPU的錯覺。在xv6中,一個進程由一個地址空間和一個線程組成。在實際操作系統中,一個進程可能有多個線程來利用多個cpu。

總結

以上是生活随笔為你收集整理的xv6book阅读 chapter2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。