已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
linux常用頭文件詳解POSIX標準定義的頭文件 目錄項 文件控制 文件名匹配類型 路徑名模式匹配類型 組文件 網(wǎng)絡(luò)數(shù)據(jù)庫操作 口令文件 正則表達式 TAR歸檔值 終端I/O 符號常量,文件是Linux的系統(tǒng)調(diào)用,好比Windows中的windows.h 文件時間 字符擴展類型- INTERNET定義 套接字本地接口 INTERNET地址族 傳輸控制協(xié)議定義- 內(nèi)存管理聲明 Select函數(shù) 套接字借口 文件狀態(tài) 進程時間 基本系統(tǒng)數(shù)據(jù)類型(如pid_t,size_t等) UNIX域套接字定義 系統(tǒng)名 進程控制-POSIX定義的XSI擴展頭文件 cpio歸檔值 動態(tài)鏈接 消息顯示結(jié)構(gòu) 文件樹漫游 代碼集轉(zhuǎn)換使用程序 語言信息常量 模式匹配函數(shù)定義 貨幣類型 數(shù)據(jù)庫操作 消息類別 輪詢函數(shù) 搜索表 字符串操作 系統(tǒng)出錯日志記錄 用戶上下文 用戶限制 用戶帳戶數(shù)據(jù)庫 - IPC(命名管道) 消息隊列資源操作 信號量 共享存儲 文件系統(tǒng)信息 時間類型 附加的日期和時間定義 矢量I/O操作-POSIX定義的可選頭文件 異步I/O 消息隊列 線程 執(zhí)行調(diào)度 信號量 實時spawn接口 XSI STREAMS接口 事件跟蹤 C/C+頭文件一覽Cinclude /設(shè)定插入點include /字符處理include /定義錯誤碼include /浮點數(shù)處理include /對應(yīng)各種運算符的宏include /定義各種數(shù)據(jù)類型最值的常量include /定義本地化C函數(shù)include /定義數(shù)學函數(shù)include /異常處理支持include /信號機制支持include /不定參數(shù)列表支持include /常用常量include /定義輸入輸出函數(shù)include /定義雜項函數(shù)及內(nèi)存分配函數(shù)include /字符串處理include /定義關(guān)于時間的函數(shù)include /寬字符處理及輸入輸出include /寬字符分類傳統(tǒng)C+include /改用include /改用include /改用include /該類不再支持,改用中的stringstream標準C+include /STL 通用算法include /STL 位集容器include /字符處理include /定義錯誤碼include /浮點數(shù)處理include /對應(yīng)各種運算符的宏include /定義各種數(shù)據(jù)類型最值的常量include /定義本地化函數(shù)include /定義數(shù)學函數(shù)include /復(fù)數(shù)類include /信號機制支持include /異常處理支持include /不定參數(shù)列表支持include /常用常量include /定義輸入輸出函數(shù)include /定義雜項函數(shù)及內(nèi)存分配函數(shù)include /字符串處理include /定義關(guān)于時間的函數(shù)include /寬字符處理及輸入輸出include /寬字符分類include /STL 雙端隊列容器include /異常處理類include /文件輸入輸出include /STL 定義運算函數(shù)(代替運算符)include /定義各種數(shù)據(jù)類型最值常量include /STL 線性列表容器include /本地化特定信息include /STL 映射容器include /STL通過分配器進行的內(nèi)存分配include /動態(tài)內(nèi)存分配include /STL常用的數(shù)字操作include /參數(shù)化輸入輸出include /基本輸入輸出支持include /輸入輸出系統(tǒng)使用的前置聲明include /數(shù)據(jù)流輸入輸出include /基本輸入流include /STL迭代器include /基本輸出流include /STL 隊列容器include /STL 集合容器include /基于字符串的流include /STL 堆棧容器include /標準異常類include /底層輸入輸出支持include /字符串類include /運行期間類型信息include /STL 通用模板類include /對包含值的數(shù)組的操作include /STL 動態(tài)數(shù)組容器C99增加的部分include /復(fù)數(shù)處理include /浮點環(huán)境include /整數(shù)格式轉(zhuǎn)換include /布爾環(huán)境include /整型環(huán)境include /通用類型數(shù)學宏而對于本書所描述的內(nèi)核源代碼,其中涉及的頭文件則可以看作是對內(nèi)核及其函數(shù)庫所提供服務(wù)的一個概要說明,是內(nèi)核及其相關(guān)程序?qū)S玫念^文件。在這些頭文件中主要描述了內(nèi)核所用到的所有數(shù)據(jù)結(jié)構(gòu)、初始化數(shù)據(jù)、常數(shù)和宏定義,也包括少量的程序代碼。除了幾個專用的頭文件以外(例如塊設(shè)備頭文件blk.h),Linux 0.12內(nèi)核中所用到的頭文件都放在內(nèi)核代碼樹的include/目錄中。因此編譯Linux 0.12內(nèi)核無需使用開發(fā)環(huán)境提供的位于/usr/include/目錄下的任何頭文件。當然,tools/build.c程序除外。因為這個程序雖然被包含在內(nèi)核源代碼樹中,但它只是一個用于組合創(chuàng)建內(nèi)核映像文件的工具程序或應(yīng)用程序,不會被鏈接到內(nèi)核代碼中。從0.95版開始,內(nèi)核代碼樹中的頭文件需要復(fù)制到/usr/include/linux目錄下才能順利地編譯內(nèi)核。即從該版內(nèi)核開始頭文件已經(jīng)與開發(fā)環(huán)境使用的頭文件合二為一。14.1 include/目錄下的文件內(nèi)核所用到的頭文件都保存在include/目錄下。該目錄下的文件如表11-1所示。這里需要說明一點:為了方便使用和兼容性,Linus在編制內(nèi)核程序頭文件時所使用的命名方式與標準C庫頭文件的命名方式相似,許多頭文件的名稱甚至其中的一些內(nèi)容都與標準C庫的頭文件基本相同,但這些內(nèi)核頭文件仍然是內(nèi)核源代碼或與內(nèi)核有緊密聯(lián)系的程序?qū)S玫?。在一個Linux系統(tǒng)中,它們與標準庫的頭文件并存。通常的做法是將這些頭文件放置在標準庫頭文件目錄中的子目錄下,以讓需要用到內(nèi)核數(shù)據(jù)結(jié)構(gòu)或常數(shù)的程序使用。另外,也由于版權(quán)問題,Linus試圖重新編制一些頭文件以取代具有版權(quán)限制的標準C庫的頭文件。因此這些內(nèi)核源代碼中的頭文件與開發(fā)環(huán)境中的頭文件有一些重疊的地方。在Linux系統(tǒng)中,列表14-1中的asm/、linux/和sys/三個子目錄下的內(nèi)核頭文件通常需要復(fù)制到標準C庫頭文件所在的目錄(/usr/include)中,而其他一些文件若與標準庫的頭文件沒有沖突則可以直接放到標準庫頭文件目錄下,或者改放到這里的三個子目錄中。asm/目錄下主要用于存放與計算機體系結(jié)構(gòu)密切相關(guān)的函數(shù)聲明或數(shù)據(jù)結(jié)構(gòu)的頭文件。例如Intel CPU 端口IO匯編宏文件io.h、中斷描述符設(shè)置匯編宏頭文件system.h等。linux/目錄下是Linux內(nèi)核程序使用的一些頭文件。其中包括調(diào)度程序使用的頭文件sched.h、內(nèi)存管理頭文件mm.h和終端管理數(shù)據(jù)結(jié)構(gòu)文件tty.h等。而sys/目錄下存放著幾個與內(nèi)核資源相關(guān)頭文件。不過從0.98版開始,內(nèi)核目錄樹下sys/目錄中的頭文件被全部移到了linux/目錄下。Linux 0.12版內(nèi)核中共有32個頭文件(*.h),其中asm/子目錄中含有4個,linux/子目錄中含有10個,sys/子目錄中含有5個。從下一節(jié)開始我們首先描述include/目錄下的13個頭文件,然后依次說明每個子目錄中的文件。說明順序按照文件名稱排序進行。14.2 a.out.h文件14.2.1 功能描述在Linux 內(nèi)核中,a.out.h文件用于定義被加載的可執(zhí)行文件結(jié)構(gòu)。主要用于加載程序fs/exec.c中。該文件不屬于標準C庫,它是內(nèi)核專用的頭文件。但由于與標準庫的頭文件名沒有沖突,因此在Linux系統(tǒng)中一般可以放/usr/include/目錄下,以供涉及相關(guān)內(nèi)容的程序使用。該頭文件中定義了目標文件的一種a.out(Assembly out)格式。Linux 0.12系統(tǒng)中使用的.o文件和可執(zhí)行文件就采用了這種目標文件格式。a.out.h文件包括三個數(shù)據(jù)結(jié)構(gòu)定義和一些相關(guān)的宏定義,因此文件可被相應(yīng)地分成三個部分:第1108行給出并描述了目標文件執(zhí)行頭結(jié)構(gòu)和相關(guān)的宏定義。第109185行對符號表項結(jié)構(gòu)的定義和說明。第186217行對重定位表項結(jié)構(gòu)進行定義和說明。由于該文件內(nèi)容比較多,因此對其中三個數(shù)據(jù)結(jié)構(gòu)以及相關(guān)宏定義的詳細說明放在程序列表后。從0.96版內(nèi)核開始,Linux系統(tǒng)直接采用了GNU的同名頭文件a.out.h。因此造成在Linux 0.9x下編譯的程序不能在Linux 0.1x系統(tǒng)上運行。下面對兩個a.out頭文件的不同之處進行分析,并說明如何讓0.9x下編譯的一些不是用動態(tài)鏈接庫的執(zhí)行文件也能在0.1x下運行。Linux 0.12使用的a.out.h文件與GNU同名文件的主要區(qū)別在于exec結(jié)構(gòu)的第一個字段a_magic。GNU的該文件字段名稱是a_info,并且把該字段又分成3個子域:標志域(Flags)、機器類型域(Machine Type)和魔數(shù)域(Magic Number)。同時為機器類型域定義了相應(yīng)的宏N_MACHTYPE和N_FLAGS,如圖14-1所示。在Linux 0.9x系統(tǒng)中,對于采用靜態(tài)庫連接的執(zhí)行文件,圖中各域注釋中括號內(nèi)的值是該字段的默認值。這種二進制執(zhí)行文件開始處的4個字節(jié)是:0x0b, 0x01, 0x64, 0x00而這里的頭文件僅定義了魔數(shù)域。因此,在Linux 0.1x系統(tǒng)中一個a.out格式的二進制執(zhí)行文件開始的4個字節(jié)是:0x0b, 0x01, 0x00, 0x00可以看出,采用GNU的a.out格式的執(zhí)行文件與Linux 0.1x系統(tǒng)上編譯出的執(zhí)行文件的區(qū)別僅在機器類型域。因此我們可以把Linux 0.9x上的a.out格式執(zhí)行文件的機器類型域(第3個字節(jié))清零,讓其運行在0.1x系統(tǒng)中。只要被移植的執(zhí)行文件所調(diào)用的系統(tǒng)調(diào)用都已經(jīng)在0.1x系統(tǒng)中實現(xiàn)即可。在開始重新組建Linux 0.1x根文件系統(tǒng)中的很多命令時,作者就采用了這種方法。在其他方面,GNU的a.out.h頭文件與這里的a.out.h沒有什么區(qū)別。14.2.3 a.out執(zhí)行文件格式Linux內(nèi)核0.12版僅支持a.out(Assembly out)執(zhí)行文件和目標文件的格式,雖然這種格式目前已經(jīng)漸漸不用,而使用功能更為齊全的ELF(Executable and Link Format)格式,但是由于其簡單性,作為入門的學習材料比較適用。下面全面介紹一下a.out格式。在頭文件a.out.h中聲明了三個數(shù)據(jù)結(jié)構(gòu)以及一些宏。這些數(shù)據(jù)結(jié)構(gòu)描述了系統(tǒng)上目標文件的結(jié)構(gòu)。在Linux 0.12系統(tǒng)中,編譯產(chǎn)生的目標模塊文件(簡稱模塊文件)和鏈接生成的二進制可執(zhí)行文件均采用a.out格式。這里統(tǒng)稱為目標文件。一個目標文件由7部分(7節(jié))組成。它們依次為:(1)執(zhí)行頭部分(exec header)。該部分中含有一些參數(shù)(exec結(jié)構(gòu)),內(nèi)核使用這些參數(shù)把執(zhí)行文件加載到內(nèi)存中并執(zhí)行,而鏈接程序(ld)使用這些參數(shù)將一些模塊文件組合成一個可執(zhí)行文件。這是目標文件唯一必要的組成部分。(2)代碼段部分(text segment)。含有程序執(zhí)行時被加載到內(nèi)存中的指令代碼和相關(guān)數(shù)據(jù)??梢砸灾蛔x形式被加載。(3)數(shù)據(jù)段部分(data segment)。這部分含有已經(jīng)初始化過的數(shù)據(jù),總是被加載到可讀寫的內(nèi)存中。(4)代碼重定位部分(text relocations)。這部分含有供鏈接程序使用的記錄數(shù)據(jù)。在組合目標模塊文件時用于定位代碼段中的指針或地址。(5)數(shù)據(jù)重定位部分(data relocations)。類似于代碼重定位部分的作用,但是用于數(shù)據(jù)段中指針的重定位。(6)符號表部分(symbol table)。這部分同樣含有供鏈接程序使用的記錄數(shù)據(jù),用于在二進制目標模塊文件之間對命名的變量和函數(shù)(符號)進行交叉引用。(7)字符串表部分(string table)。該部分含有與符號名對應(yīng)的字符串。每個目標文件均以一個執(zhí)行數(shù)據(jù)結(jié)構(gòu)(exec structure)開始。該數(shù)據(jù)結(jié)構(gòu)的形式如下:各個字段的功能如下:1)a_magic該字段含有三個子字段,分別是標志字段、機器類型標識字段和魔數(shù)字段,參見圖11-1。不過對于Linux 0.12系統(tǒng)其目標文件只使用了其中的魔數(shù)子字段,并使用宏N_MAGIC()來訪問,它唯一地確定了二進制執(zhí)行文件與其他加載的文件之間的區(qū)別。該子字段中必須包含以下值之一:OMAGIC。表示代碼和數(shù)據(jù)段緊隨在執(zhí)行頭后面并且是連續(xù)存放的。內(nèi)核將代碼和數(shù)據(jù)段都加載到可讀寫內(nèi)存中。編譯器編譯出的目標文件的魔數(shù)是OMAGIC(八進制0407)。NMAGIC。同OMAGIC一樣,代碼和數(shù)據(jù)段緊隨在執(zhí)行頭后面并且是連續(xù)存放的。然而內(nèi)核將代碼加載到了只讀內(nèi)存中,并把數(shù)據(jù)段加載到代碼段后下一頁可讀寫內(nèi)存邊界開始。ZMAGIC。內(nèi)核在必要時從二進制執(zhí)行文件中加載獨立的頁面。執(zhí)行頭部、代碼段和數(shù)據(jù)段都被鏈接程序處理成多個頁面大小的塊。內(nèi)核加載的代碼頁面是只讀的,而數(shù)據(jù)段的頁面是可寫的。鏈接生成的可執(zhí)行文件的魔數(shù)即是ZMAGIC(0413,即0x10b)。2)a_text該字段含有代碼段的長度值,字節(jié)數(shù)。3)a_data該字段含有數(shù)據(jù)段的長度值,字節(jié)數(shù)。4)a_bss含有bss段的長度,內(nèi)核用其設(shè)置在數(shù)據(jù)段后初始的break(brk)。內(nèi)核在加載程序時,這段可寫內(nèi)存顯現(xiàn)出處于數(shù)據(jù)段后面,并且初始時為全零。5)a_syms含有符號表部分的字節(jié)長度值。6)a_entry含有內(nèi)核將執(zhí)行文件加載到內(nèi)存中以后,程序執(zhí)行起始點的內(nèi)存地址。7)a_trsize該字段含有代碼重定位表的大小,是字節(jié)數(shù)。8)a_drsize該字段含有數(shù)據(jù)重定位表的大小,是字節(jié)數(shù)。 在a.out.h頭文件中定義了幾個宏,這些宏使用exec結(jié)構(gòu)來測試一致性或者定位執(zhí)行文件中各個部分(節(jié))的位置偏移值。這些宏有:N_BADMAG(exec)。如果a_magic字段不能被識別,則返回非零值。N_TXTOFF(exec)。代碼段的起始位置字節(jié)偏移值。N_DATOFF(exec)。數(shù)據(jù)段的起始位置字節(jié)偏移值。N_DRELOFF(exec)。數(shù)據(jù)重定位表的起始位置字節(jié)偏移值。N_TRELOFF(exec)。代碼重定位表的起始位置字節(jié)偏移值。N_SYMOFF(exec)。符號表的起始位置字節(jié)偏移值。N_STROFF(exec)。字符串表的起始位置字節(jié)偏移值。重定位記錄具有標準的格式,它使用重定位信息(relocation_info)結(jié)構(gòu)來描述,如下所示:該結(jié)構(gòu)中各字段的含義如下:1)r_address該字段含有需要鏈接程序處理(編輯)的指針的字節(jié)偏移值。代碼重定位的偏移值是從代碼段開始處計數(shù)的,數(shù)據(jù)重定位的偏移值是從數(shù)據(jù)段開始處計算的。鏈接程序會將已經(jīng)存儲在該偏移處的值與使用重定位記錄計算出的新值相加。2)r_symbolnum該字段含有符號表中一個符號結(jié)構(gòu)的序號值(不是字節(jié)偏移值)。鏈接程序在算出符號的絕對地址以后,就將該地址加到正在進行重定位的指針上。(如果r_extern比特位是0,那么情況就不同,見下面。)3)r_pcrel如果設(shè)置了該位,鏈接程序就認為正在更新一個指針,該指針使用pc相關(guān)尋址方式,是屬于機器碼指令部分。當運行程序使用這個被重定位的指針時,該指針的地址被隱式地加到該指針上。4)r_length該字段含有指針長度的2的次方值:0表示1字節(jié)長,1表示2字節(jié)長,2表示4字節(jié)長。5)r_extern如果被置位,表示該重定位需要一個外部引用;此時鏈接程序必須使用一個符號地址來更新相應(yīng)指針。當該位是0時,則重定位是“局部”的。鏈接程序更新指針以反映各個段加載地址中的變化,而不是反映一個符號值的變化。在這種情況下,r_symbolnum字段的內(nèi)容是一個n_type值;這類字段告訴鏈接程序被重定位的指針指向那個段。6)r_padLinux系統(tǒng)中沒有使用的4個比特位。在寫一個目標文件時最好全置0。符號將名稱映射為地址(或者更通俗地講是字符串映射到值)。由于鏈接程序?qū)Φ刂返恼{(diào)整,一個符號的名稱必須用來表示其地址,直到已被賦予一個絕對地址值。符號是由符號表中固定長度的記錄以及字符串表中的可變長度名稱組成。符號表是nlist結(jié)構(gòu)的一個數(shù)組,如下所示:其中各字段的含義為:1)n_un.n_strx含有本符號的名稱在字符串表中的字節(jié)偏移值。當程序使用nlist()函數(shù)訪問一個符號表時,該字段被替換為n_un.n_name字段,這是內(nèi)存中字符串的指針。2)n_type用于鏈接程序確定如何更新符號的值。使用第146154行開始的位屏蔽(bitmasks)碼可以將8比特寬度的n_type字段分割成三個子字段,如圖14-2所示。對于N_EXT類型位置位的符號,鏈接程序?qū)⑺鼈兛醋魇恰巴獠康摹狈?,并且允許其他二進制目標文件對它們的引用。N_TYPE屏蔽碼用于鏈接程序感興趣的比特位: N_UNDF。一個未定義的符號。鏈接程序必須在其他二進制目標文件中定位一個具有相同名稱的外部符號,以確定該符號的絕對數(shù)據(jù)值。特殊情況下,如果n_type字段是非零值,并且沒有二進制文件定義了這個符號,則鏈接程序在BSS段中將該符號解析為一個地址,保留長度等于n_value的字節(jié)。如果符號在多于一個二進制目標文件中都沒有定義并且這些二進制目標文件對其長度值不一致,則鏈接程序?qū)⑦x擇所有二進制目標文件中最大的長度。N_ABS。一個絕對符號。鏈接程序不會更新一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遼寧現(xiàn)代服務(wù)職業(yè)技術(shù)學院《生物學教學藝術(shù)與教學設(shè)計》2023-2024學年第一學期期末試卷
- 蘭州工商學院《半導(dǎo)體器件制造及測試技術(shù)》2023-2024學年第一學期期末試卷
- 吉林藝術(shù)學院《結(jié)構(gòu)穩(wěn)定》2023-2024學年第一學期期末試卷
- 湖南稅務(wù)高等??茖W?!讹L景區(qū)規(guī)劃與設(shè)計》2023-2024學年第一學期期末試卷
- 湖南電子科技職業(yè)學院《城市修建性詳細規(guī)劃》2023-2024學年第一學期期末試卷
- 黑龍江生態(tài)工程職業(yè)學院《園林植物生物技術(shù)》2023-2024學年第一學期期末試卷
- 重慶藝術(shù)工程職業(yè)學院《影視動畫制作》2023-2024學年第一學期期末試卷
- 重慶機電職業(yè)技術(shù)大學《機器學習與模式識別II(雙語)》2023-2024學年第一學期期末試卷
- 中央司法警官學院《建筑空間生活》2023-2024學年第一學期期末試卷
- 浙江農(nóng)林大學《社區(qū)管理與服務(wù)》2023-2024學年第一學期期末試卷
- Unit 3 We should obey the rules. Lesson15(說課稿)-2023-2024學年人教精通版英語五年級下冊
- 綿陽市高中2022級(2025屆)高三第二次診斷性考試(二診)語文試卷(含答案)
- 2024年聊城市東昌府區(qū)中醫(yī)院招聘備案制工作人員考試真題
- 2025年極兔速遞有限公司招聘筆試參考題庫含答案解析
- 一般固廢處理流程
- 《健康體檢知識》課件
- 《AIGC應(yīng)用實戰(zhàn)(慕課版)》-課程標準
- 政府機關(guān)辦公用品配送方案
- 永威置業(yè)項目交付前風險排查表
- 《儲能材料與器件》課程教學大綱(新能源材料與器件專業(yè))
- 人力資源許可證制度(服務(wù)流程、服務(wù)協(xié)議、收費標準、信息發(fā)布審查和投訴處理)
評論
0/150
提交評論