Linux 0 11 系統呼叫原理

2021-05-22 10:29:57 字數 1370 閱讀 1952

一、概述

系統呼叫是乙個軟中斷,中斷號是0x80,它是上層應用程式與linux系統核心進行互動通訊的唯一介面。通過int 0x80,就可使用核心資源。不過,通常應用程式都是使用具有標準介面定義的c函式庫間接的使用核心的系統呼叫,即應用程式呼叫c函式庫中的函式,c函式庫中再通過int 0x80進行系統呼叫。

所以,系統呼叫過程是這樣的:

應用程式呼叫libc中的函式->libc中的函式引用系統呼叫巨集->系統呼叫巨集中使用int 0x80完成系統呼叫並返回。

二、相關的資料結構

在說具體的呼叫過程之前,這裡先要說幾個資料結構。

1)系統呼叫函式表

系統呼叫函式表sys_call_table是在sys.h中定義的,它是乙個函式指標陣列,每個元素是乙個函式指標,它的值是各個系統提供的供上層呼叫的系統函式的入口位址。也就是說通過這個表就可以呼叫各個系統函式。

2)函式指標偏移巨集

這是一系列巨集,它們的定義在unistd.h中,基本形式為#define _nr_name value,name為系統函式名字,value是乙個整數值,是name所對應的系統函式指標在sys_call_table中的偏移量。

3)系統呼叫巨集

系統呼叫巨集_syscalln(type,name)在核心的unistd.h檔案中定義的,對它展開就是:

type name(引數列表)

;其中,n為引數個數,type為函式返回值型別,name為所要呼叫的系統函式的名字。在unistd.h中共定義了4個這樣的巨集(n從0到3),也就是說,0.11核中系統呼叫最多可帶3個引數。

那麼下面就說這個巨集幹了什麼,也就是說上面的那個「呼叫過程」是怎麼樣的呢?在這個巨集中嵌入了彙編代   碼,做的工作就是int 0x80,其中將字串「_nr_」和name連線,組成乙個巨集並將這個巨集的值,也就是系統   函式在sys_call_table中偏移量送到eax中;同時指明系統函式將來的返回值放到eax中。

三、系統呼叫處理過程

下面我再說一下系統呼叫的核心軟中斷int 0x80具體幹了什麼。這條指令會引起cpu的軟體中斷,cpu會根據中斷號找到中斷處理程式。這個中斷處理程式是在system_call.s中。在中斷處理程式的工作過程大致是這樣的:

1)將暫存器ds,es,fs以及存有引數的edx,ecx,ebx入棧,再ds,es,指向核心段,fs指向使用者段。

2)根據eax中的偏移值,在函式表sys_call_table中找到對應的系統函式指標(函式的入口位址)。並利用call指令呼叫系統函式,返回後,程式把返回值加入堆疊。

3)檢查執行本次系統呼叫的程序的狀態,如果發現由於某種原因原程序沒處在就緒狀態或者時間片到了,就會執行程序排程函式schedule()。

4)通過執行這次呼叫的程式的**選擇符判斷它是不是普通使用者程式,如果是就呼叫訊號處理函式。若不是就直接彈出棧內容,並返回

Linux 0 11 系統呼叫學習

通過增加乙個系統呼叫來了解系統呼叫的實現原理。增加 int fun void 1 在include unistd.h 中加入 define nr fun72 加入系統函式呼叫宣告 int fun void 2.在include linux sys.h 加入系統函式宣告 extern int sys ...

分頁基本原理 linux0 11

我們都知道cpu定址過程是 邏輯位址 分段 線性位址 分頁 實體地址。邏輯位址由段選擇符和段偏移位址兩部分組成 可以通過段選擇符在段描述符表中找到段基位址,段基位址 段偏移位址 線性位址。在32位cpu架構中,mmu使用的是平坦記憶體模型,即所有的段基位址都是0,所以邏輯位址可以很容易在分段過程中過...

linux0 11程序睡眠喚醒原理分析

程序的睡眠是通過呼叫sleep on函式,該函式修改了程序的狀態並且通過schedule函式切換到其他程序執行,從而實現程序的掛起,task uninterruptible狀態的程序只能被wake up函式喚醒。task interruptible狀態的程序可以被wake up和訊號喚醒。喚醒的時候...