歷史
現今Linux , Mac OS X , FreeBSD , OpenBSD
都是由1980年代的System V 以及 BSD(Berkeley Software Distribution)發展而來。
而手機的Android是由google修改Linux而來
ios是由Mac OS修改而來。
標準
POSIX (Portable Operating System Interface for Unix)
是IEEE為在unix上執行軟體,所定義的API標準的總稱。
SUS (Single Unix Specification)
單一unix規範,是POSIX的擴充,定義標準的unix作業系統,是由IEEE與The Open Group 所提出。
架構
如上圖,system call code被放在kernel中,會通過特殊指令(比如Read、Write ..)來跳至kernel執行。 (所以是一種interrupt)
其功能是讓process能使用硬體資源,比如讀取device的data。
system call基本上可由一張整數對應到指令碼的table實作。
如上圖是process狀態轉移表,
其中blocked是為了time sharing 架構而生
在等待資源、執行過久時會發生。
而等待資源通常就會是因為需要硬體資源而呼叫system call。
(waiting狀態是Ready to be scheduled
blocked 狀態已經在schduling,可是在等資源)
種類
通常system call會處理OS的工作
比如管理process , file, networking sockets, signals , terminal , threads I/O device …
signal
signal通常是事件發生時會回傳的訊號
比如0是正常、seg fault也會有訊號…
system call 也可以視為對Operating system請求工作
process
Address space就是那塊給process的記憶體空間
通常會用mmap (memory map) , munmap(memory unmap),去跟OS要求記憶體
address = mmap(5000) #以5000 bytes 開頭的一個page (一塊記憶體)
# do something
munmap(address)
-
注意: mmap需要足夠的空間(如下圖)
-
注意: 為甚麼deallocate (unmap)重要?
通常情況下執行完成OS就會收回memory,但這在大型尤其是多工系統則非常重要。
fork 與 exec
基礎參考這裡
fork會分支程式
值得注意的有兩點
- 實體memory與邏輯記憶體有mapping關係
- fork剛出生的child process會先跟原程式共用RAM
直到新child被寫入時,再copy一份新frame給child寫入 (不用每次都製造一份一模一樣的複本)
exec系列其實也只是把frame中的code替換而已。
environment
即為系統設定檔,比如知名的PATH就是環境變數之一
“環境"本質上就是一堆name=value的變數所組成
環境變數會大寫
#user id
通常process id 會與user id 綁定,而user會與權限綁定,所以如果權限不夠高,會被system call 拒絕
其中root (superuser) user id == 0
每個process會有三個 user id
- real id : 決定擁有者
- effective id : 決定權限
- saved id : 由exec設定,與effective id 相符
每個檔案和目錄都只會有一個user擁有(一個user id )
EX: sudo 時會用exec 改變effective id 以執行更核心的程式
seteuid , setuid 也可以改變uid,通常也會搭配在fork-exec過程中
參考資料
- 主課程:https://www.youtube.com/watch?v=xHu7qI1gDPA&t=144s&ab_channel=BrianWill
- POSIX:https://zh.wikipedia.org/wiki/%E5%8F%AF%E7%A7%BB%E6%A4%8D%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%8E%A5%E5%8F%A3#:~:text=%E5%8F%AF%E7%A7%BB%E6%A4%8D%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1%E6%8E%A5%E5%8F%A3,%E5%90%8D%E7%A7%B0%E4%B8%BAISO%2FIEC%209945%E3%80%82