linux 核心(系統) 函式的理解 巨集的程式除錯

2022-09-03 11:57:07 字數 3196 閱讀 9230

核心主要有:程序排程、記憶體管理、虛擬檔案系統、網路介面和程序通訊五個部分組成。

程序排程是cpu對多個程序對cpu訪問的排程演算法,使得程序巨集觀上並行執行。常用的排程演算法有:先來先服務原則、高優先級別優先、短程序優先(誰執行的時間短,就上)、時間片輪訓(每個程序都給點時間執行)。

系統所有的程序,都必須使用程序排程演算法,所以是處於中心的位置。

記憶體管理的主要作用是管理程序之間記憶體。

一般對於 32位的 linux 系統而言,linux程序都擁有自己獨立的4gb的記憶體空間,0~3gb的使用者空間,3~4gb的核心空間。

linux的虛擬檔案系統(vfs)是實際檔案系統的一種抽象,為所有的裝置統一的介面。顯示的檔案系統:比如有 fat16、fat32、ntfs、yaffs、jffs2,ext,ext2,這麼多的不同格式的系統,不同的格式有屬於自己的一套檔案運算元據據結構(file_operation)、那麼寫應用層**的時候,難道要對這麼多的檔案系統做不同的處理操作麼麼,這個時候,虛擬檔案系統就產生了,虛擬檔案系統統一管理這些現實的的檔案系統,然後提供統一的介面,這樣應用層就可以使用統一的open read write 去訪問了。

網路介面實現了對各種的網路標準的訪問和各種網路硬體的支援。所以網路介面可以分為網路協議和網路驅動程式。網路協議實現的是每一種網路傳輸協議,比如說tcp/ip協議具體是怎麼實現的,

網路驅動:其實就是網路硬體裝置的驅動,實現硬體的這部分驅動。

linux程序間通訊(ipc),包含:管道(無名管道和有名管道)、訊號、訊息佇列、共享記憶體、套接字、訊號量。

對於向外提供的 api 而言,有作業系統的提供的 api 和c庫提供的 api。比如對

檔案的操作而言: open、write、read、close。而c庫提供的介面: fopen、fwrite、fread、fclose。本質上,fopen 就是使用 open 函式進行而二次封裝。

對於不同的系統而言,系統提供的 api 幾乎都是不同的;而對於 c庫 而言,不同的平台只要使用的是 c庫,c庫 的api 都是一樣的,所以對於移植性的話,c庫的移植性就高。

通常來說,不論大大小小的子函式都是會存在乙個返回值,函式的返回值一般都是不會直接使用void 型別。之所以函式即使不會被呼叫也都是會執行乙個返回值:

(1)首先,在c語言中,一般是,返回值為零,一般是正常退出,而返回值為負一的情況的話,就是出現異常,而返回值是正直的話,那麼一般就是自己定義的。

return0;

return -1

;

return

1;

(2)return 語句的話,那麼就表示函式的**到這裡就已經是全部結束了。

(3)函式的返回值與輸入的引數可以理解為原材料以及經過加工(函式體)之後的產品。

#ifdef __cplusplus

#define null 0

#else /* __cplusplus */

#define null ((void *)0)

#endif /* __cplusplus */

#endif /* null */

當定義了 __cplusplus 巨集的時候,則 null 為零,也就是當編譯器為 c++ 的時候,則 null為零;而是 c 編譯器的時候,則 null 為 (void *)0。這裡的零可以理解為:數字零以及位址零,具體的環境具體分析。

讓野指標指向安全零位址

一般指標定義的時候:

int *p = null;
其將 p 指向位址零,因為一般來說零位址都是不可以被隨便訪問的。

'

\0' :是乙個轉義的字元,對應的 ascii 是 0'0

' : 是乙個字元,對應的 ascii 是 48

0: 是乙個數字,本質就是零,對用的 ascii 也是零。

null :是乙個表示式,null 的本質就是

0。

注意:'\0' : 是字串的結束的標誌。

'0' : 對應零這個字元的 ascii,一般用於獲取零的 ascii 值。

0 : 數字,

null : 一般用於指標。

巨集的除錯的方法是非常的方便,

應用除錯:

#ifdef debug

#define dbg(...) fprintf(stderr, " dbg(%s, %s(), %d): ", __file__, __function__, __line__); fprintf(stderr, __va_args__)

#else

#define dbg(...)

#endif

列印當前的檔案、函式、行號。

__va_args__ :是將 dbg 括號裡面的轉為實際的字串。當取消了 debug 的定義,則後面的除錯資訊doing不會被編譯進去已經列印出資訊。

#if 0

#define dbg(x...) printk(x)

#else

#define dbg(x...) do{}while(0)

#endif

核心的除錯:

#define debug(fmt, args...)     printk(fmt, ##args)

#else

#define debug(fmt, args...) do {} while (0)

#endif

... : 三點表示的變參,也就是引數的個數是不定的。對於變參的理解在另外的帖子做詳細的介紹。

深入理解Linux核心 系統呼叫

系統呼叫 使用者態程序向核心發出的,實現使用者態程序呼叫硬體裝置的函式或者中斷 優點 使程式設計更容易,將使用者從學習硬體裝置的低階程式設計特性中解放 提高系統到安全性,核心在滿足請求之前可以做正確性檢查 提高可移植性 系統呼叫與api呼叫的區別 1 api呼叫是乙個函式定義 系統呼叫是通過軟中斷向...

Linux核心系統呼叫的新增

本文通過自身實踐,介紹了在linux下為核心新增系統呼叫的簡單例項。系統呼叫 作業系統為使用者態程序與硬體及核心資源進行互動提供的一組介面 系統呼叫可被看成是乙個核心與使用者空間程式互動的介面。優點 極大的提高了系統的安全性 使使用者程式具有可移植性。系統呼叫與核心函式 核心函式在形式上與普通函式一...

Linux 核心系統體系結構

linux 核心主要由 5 個模組構成,它們分別是 程序排程模組 記憶體管理模組 檔案系統模組 進 程間通訊模組和網路介面模組。程序排程模組用來負責控制程序對 cpu 資源的使用。所採取的排程策略是各程序能夠公平合理地訪 問 cpu,同時保證核心能及時地執行硬體操作。記憶體管理模組用於確保所有程序能...