一、引入系統呼叫
1.概念:作業系統為在使用者態執行的程序與硬體裝置進行交到提供了一組介面。linux通過向核心發出系統呼叫來實現這些介面
2.作用:
對硬體裝置操作的程式設計更容易
提高了系統的安全性
使程式更有可移植性
3.進入系統呼叫的兩種方法
(1)int &0x80彙編指令
(2)sysenter彙編指令
二、系統呼叫與api的區別
1.api只是乙個函式定義,說明了如何獲得乙個給定的服務
系統呼叫中通過軟中斷向核心發出乙個明確的請求
2.api可以不使用系統呼叫,也可以使用多個系統呼叫
多個api也可以呼叫封裝了不同功能的同一系統呼叫
3.系統呼叫屬於同核心
使用者態的庫函式不屬於核心
三、通過int $0x80彙編指令進入系統呼叫
1.切換到核心態
2.把系統呼叫號和所需要暫存器(不包括eflags.cs.ss.eip.esp)存入棧中
3.在ds和es中裝入核心資料段和段選擇符
4.把thread_info的位址裝入ebx
5.呼叫與eax中的所包含的系統呼叫號相對應的服務程式
6.服務程式結束
7.從eax獲得服務程式的返回值
8.恢復儲存在核心中的暫存器值
9.重新開始執行使用者態程序
四、通過sysenter彙編指令進入系統呼叫
1.把系統呼叫號裝入eax
2.把ebp.edx.ecx儲存到使用者堆疊
3.把使用者堆疊的指令放入ebp
4.把sysenter使用的三個特殊的暫存器的內容,分別裝入cs.eip.ss.esp中
5.cpu從使用者態切換到核心態
6.建立核心堆疊指標
7.把使用者資料段的段選擇符、當前使用者指標、eflags、使用者**段的段選擇符、退出系統呼叫時要執行的指令的位址,依次儲存到核心堆疊中
8.同「三的2-5步」
9.服務程式結束
10.獲取服務程式的返回碼
11.從核心堆疊中取出第7步儲存的內容
12.切換到使用者態sy***it
五、system_call()和sysenter_entry()是linux中所有系統呼叫的入口點
六、引數的傳遞
1.普通c函式的傳遞:把引數值寫入活動的程式棧
2.系統呼叫的引數傳遞:在系統呼叫前,引數被寫入cpu暫存器,在呼叫系統呼叫服務程式前,把引數拷貝到核心堆疊中
3.系統呼叫是一種橫跨使用者和核心兩大陸地的特殊函式,所以既不能使用使用者態棧,也不能使用核心態棧
4.服務程式的返回值寫入eax中
Linux 2 6 驅動模板
obj m vs10xx.o vs10xx objs vs10xx.o kerneldir home kerson linux 2.6.39 pwd shell pwd modules make c kerneldir m pwd modules cp vs10xx.ko armnfs phony ...
Linux2 6程序切換
1.程序切換是指 儲存prev程序的上下文,用next的上下文替代。其中上下文包括 頁全域性目錄 核心態堆疊 硬體上下文。2.80x86為程序切換提供的硬體支援 第一種 通過任務門 第二種 通過jmp和call指令 把硬體上下文存在tss中,執行這條指令時,通過硬體自動切換tss,完成硬體上下文的過...
linux 2 6同步機制
作業系統的同步機制是老話題了,不過技術的東西放久不用了就容易忘記,在這裡就訊號量為大家整理一下思緒。在linux系統中,訊號量是一種可以睡眠的鎖。如果程序a希望占有乙個正在被程序b使用的訊號量時,程序a會被推入等待佇列,然後睡眠。直到程序b將持有的訊號量釋放,處於等待佇列中的程序a才會被喚醒,並獲得...