# 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)