讀書-Linux內核設計與實現 一

內核一般處於系統態,其擁有受保護的內存空間和訪問硬件設備的所有權限,這種系統和被保護起來的空間,被稱爲內核空間,相對而言,應用程序處於用戶空間,應用程序通過系統調用和內核進行通信。應用程序通過調用相應的庫函數(如C庫函數),再由庫函數通過系統調用界面讓內核代其完成各種不同的任務。如printf函數最後是通過write()系統調用把處理後的最終數據寫在終端的。

處理器在任何指定時間點上的活動範圍可以爲以下三者之一:1、運行於內核空間,處於進程上下文,代表某個特定的進程執行;2、運行於內核空間,處於中斷上下文,與進程無關,處理某個特定的中斷;3、運行於用戶空間,執行用戶進程;

CPU空閒時,內核就運行一個空進程,處於進程上下文,但運行於內核空間。

內核編程與應用程序開發的區別:

內核編程時不能訪問C庫,必須使用GNU C

內核編程時缺乏像用戶空間那樣的內存保護機制,很難使用浮點數,且只有一個很小的定長堆棧,由於其支持異步中斷、搶佔和SMP,故必須時刻注意同步和併發。

每個線程都擁有一個獨立的程序計數器、進程和一組進程寄存器,內核調度的對象是線程,而非進程。創建新的進程都是爲了立即執行新的、不同的程序,而接着調用exec*()這類函數以創建新的地址空間,並把新的程序載入。在Linux內核中,fork()實際上是由clone()系統調用實現的。

在內核中,訪問任務通常需要獲得指向其task_struct指針,實際上,內核中大部分處理進程的代碼都是直接通過task_struct進行的,不同的硬件體系,獲得該指針的方法不同,在X86系統中,通過在內核棧的尾端創建thread_info結構,通過計算偏移間接地查找task_struct結構(其包含一個進程所有的信息)

Fork()使用了寫時拷貝的技術,寫時拷貝是一種可以推遲甚至免除數據的技術。內核此時並不複製整個進程地址空間,而是讓父子進程共享同一個拷貝。只有在需要寫入的時候,數據纔會被複制,從而使各個進程擁有各自的拷貝。也就是說,資源的複製只有在需要寫入的時候才進行,在此之前,只是以只讀方式共享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章