---
# System prepended metadata

title: Kernel
tags: [系統程式設計]

---

#重要概念  
  
層層的設計，把複雜度封裝起來  
  
\# 作業系統  
  
Os 跟 Os kernel 不一樣  
前者是軟體，裡面包了內層跑在硬體上的 OS kernel，前者軟體部份會跟 kernel 一起合作  
  
Linux 就是單純 kernel 的部分  
  
而其他例如 Ubuntu ，就是包了 Linux 的 OS  
這裡也用到封裝的概念  
  
這堂課會討論 一個是 Linux kernel 提供的 ApI  
  
另一個是看 OS 使用這些 Api 後提供了我們什麼樣的服務  
  
system call 是一個介面，讓外面的人可以去使用 kernel 提供的服務  
  
照那張圖，我們可以用應用程式叫出一個 shell ，可以在上面打指令，然後他會幫我們做 system call 跟 kernel 拿服務  
  
  
Shell 執行 cd, cat, gcc 等等的程式，然後程式會call自己所需的library  
  
由 system call 那個環隔出 user mode 跟 kernel mode  
  
system call 特指 user mode 使用了 kernel mode的 function ，而其他就是普通的 function call  
  
那三行，因為 printf 會使用 sys_write 或者就是 write 這個 kernel 的 function ，其他兩行也最終都會使用該 function ，所以都需要做 system call  
要注意 c 當中的 write 是圖書館提供的一個 function ，跟 kernel 的 function 不一樣  
  
Library routines 就是 C 的圖書館，像是 printf 就如上面一樣也會叫 system call  
  
c 的標準就是根據函式庫  
  
shell 也是一個 application ，是一個一直在跑的程式  
  
所以那個環就是，你寫了一個 application ，你可以  
1\. 直接叫 system call 來使用 kernel 的服務  
2\. 執行 shell 這個程式，讓他來跟 kernel 互動，由他叫 system call  
3\. 執行 C 的圖書館，由他來跟 kernel 互動，由他叫 system call  
  
切換成 Kernel mode 前會判斷兩件事  
第一，先判斷你 user mode 的權限夠不夠  
第二，判斷你要求的功能 kernel 做不做的到  
  
如果他做的到，也是由他來做，會暫時切換到 kernel mode 由他來做，然後再切回來  
  
要記住，所謂的由他來做，不是分成兩個 process 之間互相交換，而是一樣在原本的 process ，只是暫時把 user 的權限提高到 kernel mode，讓他可以用 kernel function ，但是做的時候是是由 kernel 來幫你做  
老師說是 track 進去那個 kernel function ，不是把資訊 send 到那個 kernel function ，兩個的計算時間方法不一樣， send 會視作在執行兩個 process ，但是模式切換一樣只是同一個 process  
  
User mode 可以存取的 memory 叫做 user memory 或 user space  
  
kernel 可以存取的 memory 不一定屬於 kernel space，會這樣講是因為 kernel 理論上權限比較高，所以原本 user space 應該都可以用，但是其實為了避免某些會壞掉的可能，所以 kernel space 有部分的 user space 是不能存取的  
  
在 user space 的記憶體是虛擬的位置，所以雖然兩個城市可能會有同樣的地址  
  
user 跟 sys 分別 是兩種 mode 的執行時間  
這兩個都是 CPU 時間  
Real 是除了 CPU 時間還包括 IO 時間  
Write 的第一個 1 代表主要輸出，也就是螢幕  
  
不要自己用 CPU 去檢查特定時間到了沒  
要用 sleep 這個 system call  
所以如果程式跑很慢，演算法已經無法再好，可能原因是出在 cpu 時間，
