從普通的函式呼叫到作業系統核心空間的訪問

2021-06-27 21:58:59 字數 2577 閱讀 6412

從普通的函式呼叫到作業系統核心空間的訪問

首先通過了解認識函式的原理來體會函式的呼叫

1)函式

首先什麼是函式,函式是用於完成特定任務的程式**自包含單元

(這裡的自包含單元聽著可能不懂,其實就是**段{}

花括號裡面的每條**,以分號結尾的集合,它們是為了完成某種特定的功能而去編寫的程式)那麼在為什麼要使用函式,一般來說,函式的使用可以省略**的重複編寫,這裡就涉及到函式的呼叫,當我們在編寫乙個程式時,可能會重複呼叫某個特定的功能去實現某種特定的現象或結果。那麼就會考慮到函式怎麼編寫的問題以及通過什麼樣的方式才可以使用被呼叫的函式。

2)函式的一般編寫形式(這裡只是個人習慣以及別人可以看懂被呼叫函式是什麼功能):

描述性的函式名字,形如  int  led_on 

(void

),這樣編寫可以讓人更明白這個函式的功能,他就是開啟

led燈的函式,這裡的

int表示這個函式的返回值是個

int型的常數,他可以表示函式執行的結果,通過函式的執行結果的返回值可以知道函式的執行狀態,一般

return 0

;表示乙個函式的成功執行,

return -1/1

;表示函式在執行過程中出錯處理,以更方便的來通知函式呼叫者,這個函式的功能有沒有實現,

這裡要注意的是函式的返回值,僅僅只能表示乙個函式的執行狀態,但是這也函式到底完成了什麼樣的功能,又是不一樣的概念了,每個函式的實現什麼樣的功能只有在自己函式模組裡才知道,當我們要使用某個函式的功能時有兩種方式可以實現

1:通過函式的返回值即

return

函式來給被用者使用

當我們使用值傳遞的時候,比如通過傳遞倆值引數(實參)給呼叫函式,在被呼叫函式裡通過兩數交換,之後再在主函式裡列印出來,你會發現兩個數的值根本沒有改變,這是為什麼呢?被呼叫的函式內部的變數只具有區域性變數,它的變數存放棧空間,當在函式呼叫完時,它會被釋放,但是為什麼通過位址傳遞,在被呼叫函式內實現兩個數的交換,在主函式列印兩個數時,會發現兩個值已經改變了,在乙個函式呼叫過程中又呼叫別的過程,其實一般棧空間有兩個指標,分別是棧指標和幀指標,對於乙個程式呼叫過程來說棧空間的棧指標是相對的,他用來存放一些儲存變數和區域性變數,而對於過程中呼叫的過程會涉及到幀指標,它用來存放一些引數和返回值,對於乙個函式的呼叫,在函式呼叫和一般函式的壓棧引數以及變數的圧棧順序:第乙個圧棧的是下一條指令的執行位址,多個引數(即對應在記憶體中的儲存空間位址)以及return

值,到這裡都是

bp幀指標,在呼叫圧棧時一般是固定的,下面存放的是一些區域性變數,儲存變數,是相對的

sp棧頂指標來表示,當乙個呼叫函式要用位址傳遞的時候,對應的是實際的位址資訊,而在內部的操作,則表示位址相關的操作,改變的變數也是實在的改變,在操作結束時棧空間重新整理被釋放,但是當在一般文獻說函式的返回值不可以返回陣列名,其實實際也可以看到返回值的有相關資訊,此時會疑問,只是在建立的棧空間,在上次的使用被釋放,但是裡面存了上次的操作值,只有在下次使用這塊位址的空間時,才會重新整理,造成這樣的假象。

3)函式之間怎麼建立通訊的

當你在主函式中要用到呼叫的函式,此時你只要把你要呼叫的函式名和函式相應需要的引數填入就可以實現函式之間的呼叫和通訊,那他又是怎麼跳轉到我們之前設定的被呼叫函式的,其實在編譯器編譯的時候會預設把每個不同的**模組通過連線到對應的記憶體位址空間,而此時注意的就是對於乙個函式名,相當於在彙編keil

軟體中通過宣告函式入口形如

_start

或者在eclipse

軟體中的彙編格式

.start

,來告知編譯器函式的入口位址(其實它僅僅只表示入口位址也就是函式體裡第一條有效可執行指令)此時當我們在主函式中遇到呼叫的函式時,對於的在

cpu處理器中的

pc指標會跳轉到被呼叫的函式入口去執行呼叫函式塊內的**塊,此時我們要注意在乙個函式**塊內的變數只具有區域性性。

4)約定函式引數

void  char (char ch ,int num)  這樣的形式表示提供什麼樣的介面,被呼叫者使用,只有呼叫者使用這樣的型別才可以成功呼叫,這裡的形參可以是一般的資料型別和指標型,根據不同型別的形參,在呼叫者之前會寫入實際的引數,即實參,實參可以是一般的區域性變數,也可以是位址相關的數值,如果傳入的是

int char 

5)核心空間的系統呼叫

上面說的呼叫只是使用者空間的函式呼叫,當明白了使用者空間的函式呼叫形式以及一般的約定,就可以用來理解核心空間的系統呼叫,在linux

管理的虛擬記憶體管理機制,在

4g的虛擬空間劃分為

0~3g

為使用者空間,用來執行普通的應用程式,普通的函式呼叫也在這段位址空間執行的,當我們要呼叫核心的呼叫函式時,在

linux

系統中為了不讓程式設計者隨便修改訪問硬體裝置,提出了硬體的保護機制,當我們要訪問物理的裝置磁碟時,會陷入核心空間,其實在陷入核心空間之前,

cpu是通過軟中斷機制實現陷入核心空間的,當

cpu取指到函式名是系統呼叫函式時,會跳到對應的軟中斷號去執行相關的操作,比如

open

乙個檔案,然後去執行讀寫相關的操作,其實在核心空間的程式執行也不是直接接觸裝置的,是通過

vfs(虛擬檔案系統)來進行相關的操作,在最後結束時會把對

vfs

作業系統 系統呼叫與核心

1.系統呼叫 作業系統服務之所以通過系統呼叫的方式供使用者使用,其根本原因是對系統進行 保護 程式的執行空間分為核心空間和使用者空間,其程式各自按不同的特權執行,在邏輯上相互隔離。應用程式不能直接訪問核心資料,也無法直接呼叫核心函式,他們只能在使用者空間操縱使用者資料,呼叫使用者空間函式。但在很多情...

作業系統的核心

核心就是 kernel 它是作業系統最底層的東西,每個作業系統都有自己的核心,由它來掌管整個硬體資源的工作狀態。所以,當有新的硬體加入到作業系統中時,若核心並沒有支援它,這個新硬體就無法工作,因為控制它的核心並不認識它。一般來說,核心為了實現使用者所需要的正確運算結果,必須要管理的事項有以下幾項。1...

作業系統核心的功能

2 作業系統核心的功能 資源抽象,資源分配,資源共享 資源抽象 用軟體抽象硬體資源,簡化對其所執行的操作,遮蔽低層的物理細節。資源分配 把所抽象的各種資源分配給多個應用程式使用,並負責 資源。資源共享 根據資源的型別和特性,提供不同的機制以確保程序獲得所需資源,允許程序共享資源並提供共享的同步和互斥...