一 使用者空間和核心空間
linux核心將這4g位元組虛擬位址空間的空間分為兩部分:
l 將最高的1g位元組(從虛擬位址0xc0000000到0xffffffff),供核心使用,稱為「核心空間」。
l 將較低的3g位元組(從虛擬位址 0x00000000到0xbfffffff),供各個程序使用,稱為「使用者空間)。
因為每個程序可以通過系統呼叫進入核心,因此linux核心由系統內的所有程序共享。於是從具體程序的角度來看,
每個程序可以擁有4g位元組的虛擬空間。如此劃分提供對系統核心安全保護機制。
使用者空間的程序和核心空間程式如何進行互動?——系統呼叫
l 為使用者空間提供統一的抽象介面;
l 保證系統的安全訪問和穩定;
l 控制程序使用者空間與核心空間的切換;
linux內部體系結構:
來自:系統呼叫過程如下:
unix系統設計理念:提供機制而不是策略
將程式設計問題分成兩個部分:機制(mechanism)和策略(policy)。對外應用程式提供介面(系統呼叫api),
而不用去關心如何實現——機制;真正的實現在系統內部,系統提供實現介面演算法而不關心如何使用——策略。
通知核心的機制是靠軟中斷實現的:
通過引發乙個異常來促使系統切換到核心態去執行異常處理程式。此時的異常處理程式實際上
就是系統呼叫處理程式。
通過異常陷入到核心中,如何執行相應的系統呼叫:
在x86上, 系統呼叫號是通過eax暫存器傳遞給核心的。在陷入核心之前,使用者空間就把相應系統呼叫所對應的號放入eax中了。
這樣系統呼叫處理程式一旦執行,就可以從eax中得到資料。
call *sys_call_table(, %eax, 4)
由於系統呼叫表中的表項是以32位(4位元組)型別存放的,所以核心需要將給定的系統呼叫號乘以4,然後用所得的結果在該表中查詢其位置。
通過異常陷入到核心中,如何傳遞引數給系統呼叫以及回傳給使用者空間:
把這些引數也存放在暫存器裡。在x86系統上,ebx、ecx、edx、esi和edi按照順序存放前五個引數。需要六個或六個以上引數的情況不多見,
此時,應該用乙個單獨的暫存器存放指向所有這些引數在使用者空間位址的指標。給使用者空間的返回值也通過暫存器傳遞。在x86系統上,它存放在
eax暫存器中。
乙個linux的系統呼叫在實現時並不需要太關心它和系統呼叫處理程式之間的關係。給linux新增乙個新的系統呼叫是件相對容易的工作。
怎樣設計和實現乙個系統呼叫是難題所在,而把它加到核心裡卻無須太多周折。
實現乙個新的系統呼叫的第一步是決定它的用途。它要做些什麼:
每個系統呼叫都應該有乙個明確的用途。在linux中不提倡採用多用途
的系統呼叫(乙個系統呼叫通過傳遞不同的引數值來選擇完成不同的工作)。
ioctl()就應該被視為乙個反例。
新系統呼叫的引數、返回值和錯誤碼又該是什麼:
系統呼叫的介面應該力求簡潔,引數盡可能少。系統呼叫的語義和行為非常關鍵;
因為應用程式依賴於它們,所以它們應力求穩定,不做改動。
設計介面的時候要盡量為將來多做考慮。你是不是對函式做了不必要的限制:
系統呼叫設計得越通用越好。不要假設這個系統呼叫現在
怎麼用將來也一定就是這麼用。系統呼叫的目的可能不變,
但它的用法卻可能改變。這個系統呼叫可移植嗎?別對機器的位元組長度和位元組序做假設。
記住unix的格言:「
提供機制而不是策略」。
新增系統呼叫要謹慎!
Linux核心學習筆記四 系統呼叫
一 使用者空間和核心空間 linux核心將這4g位元組虛擬位址空間的空間分為兩部分 l 將最高的1g位元組 從虛擬位址0xc0000000到0xffffffff 供核心使用,稱為 核心空間 l 將較低的3g位元組 從虛擬位址 0x00000000到0xbfffffff 供各個程序使用,稱為 使用者空...
linux核心學習筆記
核心的配置 a.make s3c2410 deconfig b.make menuconfig 圖形化配置 c.使用廠家給出的配置 生成.config 編譯生成核心,使用如下命令 make vmlinux make uimage 帶頭部 真正核心 1 config 建立生成autoconf.h 供源...
Linux核心學習筆記
2.2 核心原始碼樹 arch 特定體系結構的原始碼 block crypto api crypto 核心原始碼文件 drivers 裝置驅動程式 firmware fs vfs和各種檔案系統 include 核心標頭檔案 init 核心引導和初始化 ipc 程序間通訊 kernel 像排程程式這樣...