linux核心基礎(系統呼叫,簡明)

2021-09-07 05:32:31 字數 1535 閱讀 1302

核心基礎(系統呼叫)

在說系統呼叫之前。先來說說核心是怎麼和我們互動的。或者說是怎麼和我們產生交集的。

首先,核心是用來控制硬體的僅僅有核心才幹直接控制硬體,所以說核心非常重要,假設核心被控制那麼電腦的一切都被控制了,所以我們須要把核心保護起來。所以shell 就誕生了,我們絕大多數情況下是在和shell 互動,應用程式也執行與shell之上。當執行一些程序時。程序會切換程序上下文。這時程序從使用者態切換到核心態,也就是常說的核心代表程序執行。可是就算如此核心依舊是被保護起來的。我們始終不能和核心直接進行資料的交換,我們差點兒不可能從核心中讀取資料。可是核心依舊能明確我們寫的函式須要執行的程序,由於我們的函式是呼叫的c庫。而c庫中的函式均是系統呼叫(能夠理解位核心的一些功能函式)的封裝表現。所以說核心能夠理解而且能執行上層的應用程式。

系統呼叫號:

在linux中每一系統呼叫都有乙個系統呼叫號,程序是不會提及系統呼叫名稱的。假設乙個系統呼叫被刪除,它所佔的系統呼叫號不會被**,由於假設**,那麼其它曾經呼叫這個函式的程式就會呼叫成別的函式,事實上是錯誤的,它還非常高興的執行呢。當中乙個系統呼叫sys_ni_syscall( )就是用來填充被刪除系統呼叫的空白的。這個函式僅僅返回-enosys這個值,然後什麼都不幹。核心記錄了系統呼叫表中的全部已經註冊過的系統呼叫列表。儲存在sys_call_table中,每一種體系結構都明白定義了這個表,裡面指定了唯一的系統呼叫號。

系統呼叫的效能:

linux系統呼叫比其它非常多的作業系統執行的要快。linux非常短的上下文切換時間非常短是乙個重要的原因,進出核心都被優化的非常便捷高效,還有乙個重要的原因就是每個系統呼叫本身就已經非常高效便捷了。

系統呼叫處理程式:

就像前邊說的那樣使用者空間是不能執行核心**的,所以系統呼叫函式不能直接放在使用者空間中執行,所以必需要靠軟中斷來實現。通過乙個異常來促使系統切換到核心態去處理異常處理程式,此時異常處理程式就是系統呼叫程式。x86有乙個叫做sysenter 的指令,這條指令被用來使陷入核心執行系統呼叫的方式。

系統呼叫的使用

由於全部的系統呼叫陷入核心的方式都一樣,所以不過陷入核心空間是不夠的因此必須把系統呼叫號一併傳給核心。x86系統是將系統呼叫號放入eax暫存器中的。通樣系統呼叫的引數也是先放在暫存器中一併傳入的,(那幾個暫存器不同系統是不同的)。

引數驗證:

不論是系統呼叫還是其它的一般的程式,引數驗證一直都是乙個重要的話題,引數驗證能夠將發生錯誤在產生損失之前。

尤其是系統呼叫,假設在核心中發生引數的錯誤,可能會造成極端的不良影響,所以必須進行嚴格的引數驗證。一般有例如以下幾條:

1.傳遞的指標指向的區域屬於使用者空間,程序絕不能哄騙核心去讀取核心空間的資料(核心是非常單純的)

2.指標指向的記憶體區域必須在程序的位址空間裡,不能哄騙核心去讀取其它程序的資料

3.讀或者寫或者是讀寫的許可權記憶體必須分明。程序決不能繞過記憶體的訪問限制

核心提供了兩種方法來完畢必須的檢查和核心空間和使用者空間的資料的來回拷貝,copy_to_user()  copy_from_user()

都須要三個引數。第乙個是目的記憶體位址。第二個是源記憶體位址。第三個位須要操作的位元組數。都是原子操作。

linux核心基礎(系統呼叫,簡明)

核心基礎 系統呼叫 在說系統呼叫之前,先來說說核心是怎麼和我們互動的,或者說是怎麼和我們產生交集的。首先,核心是用來控制硬體的只有核心才能直接控制硬體,所以說核心很重要,如果核心被控制那麼電腦的一切都被控制了,所以我們需要把核心保護起來,所以shell 就誕生了,我們絕大多數情況下是在和shell ...

Linux核心設計基礎(七)之系統呼叫

我理解的系統呼叫就是核心提供的一組使用者程序與核心進行互動的介面。除異常和陷入外,系統呼叫是核心唯一的合法入口。像 proc也是通過系統呼叫進行訪問的。系統呼叫的意義 系統呼叫的基本原理 系統呼叫通常的入口是c庫中定義的函式,也可以是自定義的函式 通過syscall進行呼叫 每個系統呼叫被賦予乙個系...

linux核心之系統呼叫

應用程式與系統呼叫 使用者應用程式訪問並使用核心所提供的各種服務的途徑,就是系統呼叫,系統呼叫介面層作為核心和使用者應用程式之間的中間層,扮演了乙個橋梁,系統呼叫把應用程式的請求傳達給核心,核心處理完後,把結果返回給應用程式。應用程式通過作業系統提供的應用程式設計介面api而不是直接通過系統呼叫來程...