# System Call & OS架構 ###### tags: `IT鐵人` ## System Call是啥 ![](https://i.imgur.com/35cb9kx.png) System Call的目的是作為執行中user process與kernel溝通的介面,代表OS可以提供的服務項目,當process執行時,若需要OS提供某種服務(例如Disk read txt內容),process會issue Trap,帶入system call ID及其相關參數(例如invoke the required system call),當OS收到此請求後,會去執行對應的system call,當完成後,再將結果通知傳回給process。 ![](https://i.imgur.com/UVyi6Kl.png) 如果用比較日常發生的事情來說,像是我們去超商取貨,一定是告訴店員手機末3碼以及名字,然後店員找到包裹後再拿給我們確認。這種翻包裹的動作不會讓我們自己拿,因為可能有其他人包裹的安全性之類的考量。 跟店員說要取包裹就像是一種system call,而提供手機末3碼及名字就是相關參數,包裹就像是結果。 OS中有許多的System Call,大致上可以分成下面6種: |類型|內容| |-|-| |Process Control|Process create/terminate/block| |File Management|Fopen, Fclose, Fread, Fwrite| |Device Management|I/O| |Information Maintenance|status, timer, date...| |Communications|Process間的溝通、recv、send| |Protection|Control access to resource, Get & Set permissions, Allow and Deny user Access| 這些都是因為可能危害系統安全所以要交給OS處理的部分,Process Controll是一個大章節,會在後面做介紹。 ## System Call傳遞方式 前面說要把System Call的相關係數傳給OS,傳輸的方式主要有下列三種: |方法|優點|缺點| |-|-|-| |利用Registers保存參數,OS從這些Registers讀取參數|Simple, fast access(without memory access)|不適合用在大量參數的狀況(Register數量有限) |利用memory,以一個Block保存這些參數,且將此Block的位址存在一個Register中,傳給OS|適用大量參數的情況|存取速度較慢| |準備一個Stack,參數可被push進去Stack,OS在從此Stack pop已取得參數|適用大量參數的情況,操作比較簡單|Stack size要大,避免overflow| ## OS Structures 前面介紹了要有System Call,kernel/user mode來保護系統以及其他process的安全,不過實作OS的方式有很多種,以下介紹七種不同的實作類型: 1. Simple 一如其名,他沒辦法Multitask,也沒有區分Dual-mode。 有名的例子是MS-DOS。 ![](https://i.imgur.com/kX8d9uE.png) 2. More complex than Simple 他的OS分成兩塊,System Program和The kernel,概念上是把靠近硬體的放在更內層的kernel。 原始的UNIX採用這種方式。 ![](https://i.imgur.com/AkBrhgZ.png) 3. Layered Approach 是比較抽象的模型,切分Layer的方式因系統而異,採用Top-Down切割,將系統分解成數個關鍵元件,上層可以使用下層功能,但下層不能使用上層功能,所以可以用Bottom-up測試。 好處是易於分工也方便測試;而壞處是Layer分割不易,並且Performance會因為Layer太多而降低。 ![](https://i.imgur.com/6IXfked.png) 4. Microkernel CMU提出的觀念,是為了簡化UNIX。 將kernel中一些比較不基本的Service從kernel中移除,改成以system library方式提供,以便得到一個較小的kernel,稱為Microkernel。 好處是microkernel易於延伸(改變可以坐在user site),OS也方便移植到另一個硬體架構(microkernel小,所以修改的量不大),並且更安全(增加的service放在user site,所以kernel出錯機會低);壞處是Performance變差(user site跟kernel的溝通變多)。 ![](https://i.imgur.com/4Bpslmx.png) 5. Monolithic kernel 與Microkernel相反,把kernel services都放在kernel mode。 優缺點也相反。 大部分的OS皆採用此作法(e.g. UNIX, Linux, Windows, Apple OS)。 6. Modular 像是打包成不同的包裹,稱為Loadable kernel modules(LKM),需要某個功能的時候把需要的包讀進Memory。 例子有Linux, Soloris... ![](https://i.imgur.com/3iaZ6Zj.png) 7. Hybrid 基本上就是每個種類都來一點,現今的OS都不會只有一種類型,像是打包的部分也有分成上下層,就是Modular跟Layered的混和。看起來就很複雜了... ![](https://i.imgur.com/MZncl2X.png) ## 就到這邊啦~ 介紹了system call的作用以及不同OS的設計方式,這些都是不斷發展改良出來的結果,再加上電腦零件的發展很迅速,所以電腦知識成長的速度就很快,每次都會有永遠學不完的感嘆。 |上一篇|下一篇| |--|--| |[Kernel Mode](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/HJ8bbihWY)|[Process](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/SyJgqbJMF)