2008/02/26

[Programming][Kernel] 系統呼叫

系統呼叫是核心程式提供的一組介面,用來與用戶層 (user-space) 中的程序互動,應用程式透過系統呼叫可以存取硬體及作業系統所提供的資源。這面扮演著郵差般的角色,讓應用程式可以對系統提出各種要求,而核心程式收到要求後會給予回應,意即滿足或拒絕這些要求。這組界面的存在讓應用程式受到約束,不能為所欲為,這也是系統之所以可以穩定的重要因素。

系統呼叫如同中間層般的存在,讓硬體及核心與用戶層得以分隔開來,在 Linux 系統底下應用程式除了 exception (例外處理) 與 trap (一種由處理器所發出,可加以截獲處理的錯誤處理方式) 只能藉由系統呼叫與核心溝通。其它型態的介面像裝置檔案 (device nodes) 或 proc 檔案系統,最終也是透過系統呼叫與核心做溝通。

用戶層的應用程式沒有辦法直接使用核心層的程式碼這是系統呼叫裡頭一個重要的原則。所以應用程式必須利用某種方式通知通知核心,同時切換到核心去執行該功能。在這邊所指的機制,就是產生軟體中斷 (software interrupt),這會讓硬體隨後產生一個異常的狀況 (exception) ,進而啟用異常處理的中介程式 (expeption handler) 來處理。

以 x86 平台為例,軟體中斷可以使用指令 $0x80 觸發,觸發後就會啟動系統到核心層,執行第 128 號程式,這個程式就是前述系統呼叫中介程式中的一員,它有一個很直覺的名字,叫 system_call() 。由於處理方式和硬體架構相關,所以採用的是組合語言的形式,放在 entry.S6 檔案裡頭。 近年來, x86 處理器加入了一個名為 sysenter 的功能。與使用 int 中斷指令相比,這個功能提供了更快速專屬的方式,可以藉由這個方式進入核心層,執行系統呼叫。這個功能很快就成為主流的一部份。然而不管系統如何呼叫中介程式,最重要的還是在用戶層用例外觸發或 trap 的方式進入核心執行的方式。

[Windows] git-bash 底下的工具

因為工作轉到 Windows 平台上的關係,所以很多工具改到 Windows 上面運作,跟著在 TortoiseGit 底下使用 git-bash 來維護自己的專案原始碼。結果就是裝了前面提過的 auto-hotkey 使用熱鍵來提昇自己的平台操作速度; 但除了 hotkey...