# OS structure ###### tags: `OS Note Pro` ## 簡介 要細述作業系統的架構,首先要先來理解:作業系統能帶給使用者什麼樣的服務,進而才能知道,我們需要怎去設計一個作業系統。而要去設計一個作業系統,必須了解他與其他層的關係是如何,其中,本文先主要介紹:OS與user space(program、user)之間的interface,也就是**System calls** 與 **API**。最後再來介紹各種現有的作業系統架構。 [Toc] ## OS Service 常見的OS Services有:**User interface(CLI、GUI)**、**Program execution**、**I/O device management**、**File system management**、**Communication (process)**、**Hardware resourse allocation**、**Protection**。 ### User interface - <font color="blue">CLI (command line interface)</font> 這種由使用者直接下指令的純文字介面我們稱為**Shell**,shell的功用是將輸入的command line去interprete 成更底層的指令,作用就像compiler一樣。相較於GUI的優點是 : 他能夠更貼近使用者的習慣,且GUI本身就是建在CLI之上的,所以CLI能辦到的事更多。 - <font color="blue">GUI</font> 有鼠標、檔案的icon等等,優點是比較user friendly,但由於要多處理這些圖形化的東西,就需要多跑許多process,所以是比純文字介面慢的。 :::info 現今的電腦幾乎兩個介面都有,但對於一些研究導向、純計算用途的電腦就會為了效能而只用CLI。 ::: ### Communication 這裡的Communication指的是,process與process之間。 因為只有OS有權利讀你的資料,所以所有的communication都必須透過OS。 - <font color="blue">Message passing</font> 當有一個process要將data傳給另一個process的時候,會先將data copy到kernel,然後另一個process再去kernel將data copy到自己的memory中。 - <font color="blue">Shared memory</font> process間彼此有共用的memory空間,需要的時候就傳到這個memory就好,也可以直接從中讀取。 :::info Message passing的缺點是 : 這樣copy來copy去太慢了。 Shared memory的缺點是 : 同時存取容易產生**dead-lock**,雖然比較快一些。 ::: ## System call v.s. API 兩者並不是平行的對等關係,而是垂直的相依關係。要叫OS幫你做事,就要透過System calls,所以說System call 就是OS的interface。而API在system call的上層,是直接與program溝通的。 - <font color="blue">API</font> 簡單來說,API就是我們常見的function,普遍是以C library(或稱為 system language)構成。它能夠處理使用者的要求,與system call之間的關係有可能是一對多、一對一或甚至一對零都不一定,所以API並不是單純的interpreter。 - <font color="blue">System call</font> 可以透過**software interrupt**來與對kernel提出要求。而為了快速,system call都已assembly language來寫。(OS唯一的interface) :::success 呼叫system call 後一定會進到kernel mode。 ::: :::info API存在的意義是 : 最主要是因為呼叫system call都需要透過interrupt,這樣太慢了,每次都要打斷kernel,所以讓API先判斷你這個function call可不可以由他自己解決,也就是1對0的情況。再者API能夠方便使用者做programing。 ::: ### Interface vs Library Interface 是接口,給他你要的參數,就可以達到你想要的事,但你不會知道它內部是怎麼實作的。 Library就是它實作的部分,實作的方法有很多,但那是designer要知道的事。 ### 常見的API - Win32 : Windows - POSIX : Linux、Unix、MacOS :::success 在相同的API下,即使OS不同,程式也是相容的,只需要Compiler就可以,不需要更改程式碼。 **Compiler** : 是將program處理成底層的instructions for 不同的kernel(硬體架構),所以在不同的kernel下compile 是必須的。 ::: ## OS Structure ### Simple OS - DOS 沒有甚麼分層架構,除了user application和driver,中間的部分都混在一起寫,所以安全性很差,管理debugger也難。 ### Layerd system 以上下分層的方式建構的系統,上層能向下層指令,但下不能往上溝通。優點是debugger變方便。 ### Microkernel 最小化核心,將其他功能都丟到user space,modulize的方式一個個在連到kernel。優點是 : 安全性高、debugger 方便,其中一個module crash,也不會連帶影響到其他module; 缺點是 : 每個module與kernel連接都有interface,傳遞變慢。 ### Moduler system 與上者很像,只是全部都搬到kernel中了,彼此傳遞也因此變快,是目前最常見的kernel架構。 ### Virtule machine 對於沒有hardware support(有VM mode 的bit)的硬體要達到"Full Virtulize"是很困難的,但VM ware做到了。VM是建立在"host kernel"上的virtule kernel,建立在user space中,所以system call 還是得靠host來處理,而這之間的協調是有些複雜的(VM -> hardware -> interrupt -> host os -> complete)。 - <font color="blue">Feature</font> 待補.... :::info VM 最怕的是**critical instruction** : 在user space和kernel space執行的結果不同。 ::: :::spoiler BIOS補充 https://www.google.com/search?q=bios&rlz=1C1CHBF_zh-TWTW896TW896&sxsrf=ALeKk01ZRQT3SsASDlJ5q6q39V9sG0fz-A%3A1617959980281&ei=LBxwYMnaEM37-Qa1taa4DQ&oq=bios&gs_lcp=Cgdnd3Mtd2l6EAMyBAgAEEMyAggAMgQIABBDMgIIADICCAAyAggAMgUIABCxAzIICAAQsQMQgwEyAggAMgIIADoHCCMQ6gIQJ1CKxMEFWP3GwQVgkMjBBWgBcAB4AIABzAGIAa0FkgEFMS4zLjGYAQCgAQGqAQdnd3Mtd2l6sAEKwAEB&sclient=gws-wiz&ved=0ahUKEwjJoIrP6vDvAhXNfd4KHbWaCdcQ4dUDCA0&uact=5 :::