自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Ubuntu Linux---GNU libc庫(kù)

系統(tǒng) Linux
除了libc和libm庫(kù),UNIX系統(tǒng)庫(kù)沒(méi)有其他標(biāo)準(zhǔn)的命名規(guī)范。Linux上的一些系統(tǒng)庫(kù)可能和UNIX平臺(tái)上庫(kù)的名稱不同,這就需要知道Linux上各庫(kù)所包含和支持的功能。表3-2根據(jù)所支持的功能列舉了一些Linux系統(tǒng)庫(kù)。

除了libc和libm庫(kù),UNIX系統(tǒng)庫(kù)沒(méi)有其他標(biāo)準(zhǔn)的命名規(guī)范。Linux上的一些系統(tǒng)庫(kù)可能和UNIX平臺(tái)上庫(kù)的名稱不同,這就需要知道Linux上各庫(kù)所包含和支持的功能。表3-2根據(jù)所支持的功能列舉了一些Linux系統(tǒng)庫(kù)。

 

 

    下面列出了GNU libc庫(kù)所包含的庫(kù)文件以及對(duì)應(yīng)的描述(注釋5):

  - ld.so,為使用了共享庫(kù)的可執(zhí)行程序提供的一個(gè)輔助程序;

  - libBrokenLocal.[a,so],Mozilla等應(yīng)用程序用以解決被破壞的locale的庫(kù)文件;

  - libSegFault.so,段錯(cuò)誤信號(hào)處理器,它試圖捕獲段錯(cuò)誤信號(hào)。

  - libanl.[a,so],異步的名稱查詢庫(kù)。

  - libbsd-compat.a,在Linux上運(yùn)行BSD程序時(shí)需要的庫(kù)。

  - libc.[a,so],最主要的C庫(kù)(常用的C函數(shù)的集合)。

  - libcrypt.[a,so],加密庫(kù)。

  - libdl.[a,so],動(dòng)態(tài)鏈接接口庫(kù)。

  - libg.a,g++運(yùn)行時(shí)庫(kù)。

  - libieee.a,IEEE浮點(diǎn)運(yùn)算庫(kù)。

  - libm.[a,so],數(shù)學(xué)庫(kù)。

  - libmcheck.a,包含啟動(dòng)時(shí)運(yùn)行的代碼。

  - libmemusage.so,memusage用來(lái)收集應(yīng)用程序內(nèi)存使用情況的庫(kù)。

  - libnsl.a,網(wǎng)絡(luò)服務(wù)庫(kù)。

  - libnss_comkpat.so,libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so,NSS(Name Service Switch)庫(kù),包含解析主機(jī)名、用戶名、組名、別名、服務(wù)、協(xié)議等的函數(shù)。

  - libpcprofile.so,包含一些跟蹤統(tǒng)計(jì)代碼行消耗CPU時(shí)間的概要分析(profiling)函數(shù)。

  - libpthread.[a,so],POSIX線程庫(kù)。

  - libresolv.[a,so],包含為網(wǎng)絡(luò)域名服務(wù)器創(chuàng)建、發(fā)送、解釋網(wǎng)絡(luò)包的函數(shù)。

  - librpcsvc.a,包含提供各種RPC服務(wù)的函數(shù)。

  - librt.[a,so],包含POSIX1.b實(shí)時(shí)擴(kuò)展所定義的大部分接口函數(shù)。

  - libthread_db.so,包含開(kāi)發(fā)多線程程序調(diào)試器的函數(shù)。

  - libutil.[a,so],包含常用的UNIX工具使用的“標(biāo)準(zhǔn)”函數(shù)。

  上面這些庫(kù)大多位于/usr/lib目錄,也有一些在/lib目錄下,例如libSegFault.so.

 

#p#

3.1.1 glibc遵循的標(biāo)準(zhǔn)

  GNU glibc發(fā)布了一個(gè)描述其所遵循的標(biāo)準(zhǔn)的報(bào)告(注釋6)。該報(bào)告同時(shí)也列出了GNU libc需要改進(jìn)的地方。寫(xiě)作本書(shū)時(shí),該報(bào)告顯示GNU libc通過(guò)了FIPS POSIX90、POSIX96、UNIX98、ANSI、C89/99,和ISO9899標(biāo)準(zhǔn)的頭文件一致性檢查。所有主要Linux發(fā)行版的glibc也都遵循LSB規(guī)范。

  3.2 GNU科學(xué)庫(kù)

  把進(jìn)行高性能計(jì)算的應(yīng)用程序移植到Linux上需要一個(gè)支持庫(kù),該庫(kù)要與UNIX平臺(tái)上的科學(xué)庫(kù)非常匹配。Linux上類(lèi)似的庫(kù)叫GNU科學(xué)庫(kù)(GNU Scientific Library,簡(jiǎn)寫(xiě)作GSL)。GSL是一系列數(shù)學(xué)運(yùn)算例程的集合。這些例程是用C語(yǔ)言重新編寫(xiě)的,并且給編程人員提供了一個(gè)新式的API模式---允許編程人員為各高級(jí)語(yǔ)言編寫(xiě)包裹函數(shù)(wrapper)。這些源代碼使用的是GPL發(fā)布許可。

  GNU科學(xué)庫(kù)包含了數(shù)學(xué)運(yùn)算領(lǐng)域的很多內(nèi)容。表3-3列出了GNU科學(xué)庫(kù)提供的例程。

 


    這些例程的用法在GSL手冊(cè)(注釋7)中有詳盡的描述,包括函數(shù)的定義、示例程序,以及函數(shù)實(shí)現(xiàn)的算法所引用的論文。

  3.3 共享庫(kù)

  我們所移植過(guò)的大多數(shù)應(yīng)用程序都使用了共享庫(kù)。然而,不同的操作系統(tǒng)在創(chuàng)建和命名共享庫(kù)時(shí)卻不盡相同。Linux上,共享庫(kù)可以有不同的文件擴(kuò)展名,例如,共享庫(kù)可以以.so或.so.1.0結(jié)束。以.so.x.x(x為數(shù)字)結(jié)尾的共享庫(kù)叫版本化庫(kù)。第一個(gè)數(shù)字代表大版本號(hào),第二個(gè)數(shù)字代表小版本號(hào)。有些情況下,共享庫(kù)的擴(kuò)展名還可以是.so.x.x.x(x為數(shù)字)的形式,這里最后一個(gè)數(shù)字代表發(fā)布號(hào),并且是可選的。下面給出了共享庫(kù)文件名的格式:

  (代碼)p58 第11行,lib.so...

  大版本號(hào)、小版本號(hào),以及發(fā)布號(hào)的變化反映了對(duì)共享庫(kù)所作的不同類(lèi)型的修改。下面是對(duì)增大大版本號(hào)、小版本號(hào)和發(fā)布號(hào)的一些指導(dǎo):

  - 當(dāng)對(duì)共享庫(kù)提供的接口做了與以前版本不兼容的改變時(shí),需要增大大版本號(hào)。這個(gè)大的改變意味著依賴該庫(kù)先前大版本的應(yīng)用程序需要作相應(yīng)修改才能使用大版本更新后的庫(kù)。

  - 當(dāng)共享庫(kù)增加了新的接口同時(shí)也保留了原來(lái)的接口時(shí),增大小版本號(hào)。

  - 當(dāng)作了與以前兼容的修改又沒(méi)有增加新接口時(shí),增大發(fā)布號(hào)。這通常是對(duì)一些實(shí)現(xiàn)做了改動(dòng)以提高性能和擴(kuò)展性。

  要在Linux上創(chuàng)建共享庫(kù),使用-shared編譯參數(shù);該參數(shù)告訴GNU ld創(chuàng)建一個(gè)共享庫(kù)而不是應(yīng)用程序。下面是這樣一個(gè)例子:

  (代碼)p58 最后一行 $ gcc –o libfoo.so –shared –fpic foo.c

 

#p#

3.4 庫(kù)版本化

  在共享庫(kù)和應(yīng)用程序之間維護(hù)二進(jìn)制級(jí)的兼容性或ABI是很重要的。共享庫(kù)的ABI是應(yīng)用程序依賴的運(yùn)行時(shí)接口;如果每次發(fā)布時(shí)共享庫(kù)的ABI都與以前的兼容,那么在其中某一個(gè)版本的共享庫(kù)上編譯的應(yīng)用程序不需要任何改動(dòng)就可以在后續(xù)版本上運(yùn)行。庫(kù)版本化就是Linux以及同期的其他操作系統(tǒng)實(shí)現(xiàn)二進(jìn)制兼容性的方法。

  我們以前移植過(guò)的一些應(yīng)用程序需要庫(kù)版本化的支持。各UNIX平臺(tái)也都實(shí)現(xiàn)了庫(kù)版本化,但實(shí)現(xiàn)的方法不盡相同。Linux提供了兩種不同的技術(shù)來(lái)實(shí)現(xiàn)庫(kù)版本化:外部庫(kù)版本化和符號(hào)版本化。

  3.4.1 外部庫(kù)版本化

  鏈接過(guò)程中,鏈接器(ld)會(huì)查找以.so結(jié)尾的共享庫(kù)文件。以.so結(jié)尾的庫(kù)文件叫鏈接器名稱,這是由他們?cè)贚inux上的使用方式?jīng)Q定的。當(dāng)編譯一個(gè)依賴某一共享庫(kù)的應(yīng)用程序時(shí),僅僅是該共享庫(kù)的soname(不是共享庫(kù)的文件名)作為依賴關(guān)系被記錄在應(yīng)用程序的二進(jìn)制代碼中。運(yùn)行時(shí)鏈接器就是使用共享庫(kù)的soname來(lái)查找和裝載該庫(kù)的。共享庫(kù)的soname只包含有大版本號(hào)(例如,libfoo.so.1)

  當(dāng)修改后的共享庫(kù)與以前版本不兼容時(shí),新的共享庫(kù)必須有一個(gè)新的外部版本名稱。也就是說(shuō),該庫(kù)的soname必須改變。這些不兼容的修改包括:刪除一個(gè)符號(hào),去掉某函數(shù)的一個(gè)參數(shù),改變了某函數(shù)的語(yǔ)義屬性以致與以前的定義不再一致并且與老版本二進(jìn)制不兼容等等。我們來(lái)看下面的例子。(見(jiàn)pdf附件 341.pdf)

   3.4.2 符號(hào)版本化

  就像前面所提到的,當(dāng)對(duì)共享庫(kù)所作的修改能夠向前兼容時(shí),我們只增大小版本號(hào)。這種修改包括增加一些新的接口同時(shí)又不改變已有的接口。但是,即使只做這種小版本的修改,也會(huì)出現(xiàn)一個(gè)很重要的問(wèn)題:一個(gè)在某一小版本的共享庫(kù)上編譯的應(yīng)用程序并不一定能夠在以前小版本的庫(kù)上運(yùn)行。這是因?yàn)樵搼?yīng)用程序可能使用了新增加的、以前小版本的庫(kù)中沒(méi)有的接口。為了解決這個(gè)問(wèn)題,引入了符號(hào)版本化。符號(hào)版本化允許共享庫(kù)記錄下每個(gè)小版本都新增了什么內(nèi)容。

  在Linux上,GNU ld可以使用-version-script連接器選項(xiàng)來(lái)創(chuàng)建符號(hào)版本化的共享庫(kù)。編譯器選項(xiàng)-Wl,--version-script=mapfile告訴鏈接器哪些符號(hào)要從生成的共享庫(kù)中輸出出來(lái)。每個(gè)符號(hào)分屬global(被輸出)和local(不被輸出)兩類(lèi)中的一種。來(lái)看下面的例子。foo.c包含一個(gè)函數(shù)foo1,該文件用來(lái)創(chuàng)建1.1版本的共享庫(kù)。(見(jiàn)附件 示例代碼.pdf)

  可以看到,這次main只引用了版本化庫(kù)的LX_1.1。

  GNU ld還允許在定義符號(hào)的源文件中把符號(hào)綁定到某一版本中,而不僅僅是在腳本文件中指定。另外,GNU ld還允許同一函數(shù)的多個(gè)版本出現(xiàn)在同一個(gè)共享庫(kù)中。更多詳細(xì)信息,請(qǐng)參考GNU ld手冊(cè)(注釋13)和Ulrich Drepper的文章“How to Write Shared Libraries”。

  從2.1版本開(kāi)始,glibc就已經(jīng)實(shí)現(xiàn)了符號(hào)版本化。符號(hào)版本化同時(shí)也是LSB規(guī)范1.2及更高版本的一部分。

  3.5 動(dòng)態(tài)鏈接器(運(yùn)行時(shí)鏈接器)

  Linux動(dòng)態(tài)鏈接器(/lib/ld.so.1或/lib64/ld64.so.1)查找和裝載應(yīng)用程序所需的共享庫(kù),準(zhǔn)備應(yīng)用程序的運(yùn)行,然后運(yùn)行應(yīng)用程序。除非編譯時(shí)為ld指明-static選項(xiàng),否則Linux二進(jìn)制程序都是動(dòng)態(tài)鏈接的。

  在所有現(xiàn)代UNIX操作系統(tǒng)上,都有一些環(huán)境變量可以影響動(dòng)態(tài)鏈接器的運(yùn)行。例如AIX上的環(huán)境變量LIBPATH可以改變動(dòng)態(tài)鏈接器的搜索路徑。以下環(huán)境變量可以影響到Linux上動(dòng)態(tài)鏈接器的運(yùn)行:

  - LD_LIBRARY_PATH,以冒號(hào)分開(kāi)的目錄列表,運(yùn)行時(shí)會(huì)在這些目錄中查找需要的庫(kù)。

  - LD_PRELOAD,以空格分開(kāi)的庫(kù)列表,這些庫(kù)會(huì)在其他所有庫(kù)之前裝載。這常常用來(lái)有選擇的覆蓋某些共享庫(kù)中的函數(shù)。

  - LD_BIND_NOW,如果該環(huán)境變量設(shè)置成非空字符串,動(dòng)態(tài)鏈接器會(huì)在程序啟動(dòng)時(shí)解析所有符號(hào),而不是首次引用時(shí)才解析符號(hào)(也就是常說(shuō)的“延遲綁定”)。這在使用調(diào)試器時(shí)非常有用。

  - LD_TRACE_LOADED_OBJECTS,如果該環(huán)境變量設(shè)置成非空字符串,程序會(huì)列出它所依賴的共享庫(kù),就像運(yùn)行l(wèi)dd命令一樣,而不是正常的執(zhí)行。

  Linux動(dòng)態(tài)鏈接器采用廣度優(yōu)先(breadth first)的方式解決庫(kù)的依賴關(guān)系。也就是說(shuō),首先是可執(zhí)行程序所依賴的庫(kù)按照動(dòng)態(tài)節(jié)(dynamic section)列出的順序被裝載進(jìn)來(lái),然后是“第一個(gè)被依賴的庫(kù)”所依賴的庫(kù)按照同樣的方法裝載進(jìn)來(lái),以此類(lèi)推,直到所有的依賴關(guān)系都被解決。

  在命令行運(yùn)行下面的命令,會(huì)得到更多關(guān)于Linux動(dòng)態(tài)鏈接器的信息:

  (代碼)(P69第最后一行)

  $ info ld.so

 

#p#

3.5.1 編程接口

  Linux提供了一套API來(lái)動(dòng)態(tài)裝載庫(kù)。下面列出了這些API:

  - dlopen,打開(kāi)一個(gè)庫(kù),并為使用該庫(kù)做些準(zhǔn)備。

  - dlsym,在打開(kāi)的庫(kù)中查找符號(hào)的值。

  - dlclose,關(guān)閉庫(kù)。

  - dlerror,返回一個(gè)描述最后一次調(diào)用dlopen、dlsym,或dlclose的錯(cuò)誤信息的字符串。

  C語(yǔ)言用戶需要包含頭文件dlfcn.h才能使用上述API。glibc還增加了兩個(gè)POSIX標(biāo)準(zhǔn)中沒(méi)有的API:

  - dladdr,從函數(shù)指針解析符號(hào)名稱和所在的文件。

  - dlvsym,與dlsym類(lèi)似,只是多了一個(gè)版本字符串參數(shù)。

  在Linux上,使用動(dòng)態(tài)鏈接的應(yīng)用程序需要和庫(kù)libdl.so一起鏈接,也就是使用選項(xiàng)-ldl。但是,編譯時(shí)不需要和動(dòng)態(tài)裝載的庫(kù)一起鏈接。程序3-1是一個(gè)在Linux上使用dl*例程的簡(jiǎn)單示例。

  (代碼)(P70-73)

  編譯該程序:

  (代碼)(P73第5行)

  $ make

  運(yùn)行程序:

  (代碼)(P73第15行)

  $ ./main

  用ldd命令檢查可執(zhí)行程序:

  $ ldd ./main

  (代碼)(P73第19行)

  可以看到,可執(zhí)行程序main沒(méi)有引用動(dòng)態(tài)裝載的庫(kù)。

  3.5.2 延遲重定位(Lazy Relocation)

  延遲重定位/裝載是一個(gè)允許符號(hào)只在需要時(shí)才重定位的特性。這常在各UNIX系統(tǒng)上解析函數(shù)調(diào)用時(shí)用到。當(dāng)一個(gè)和共享庫(kù)一起鏈接的應(yīng)用程序幾乎不會(huì)用到該共享庫(kù)中的函數(shù)時(shí),該特性被證明是非常有用的。這種情況下,只有庫(kù)中的函數(shù)被應(yīng)用程序調(diào)用時(shí),共享庫(kù)才會(huì)被裝載,否則不會(huì)裝載,因此會(huì)節(jié)約一些系統(tǒng)資源。但是如果把環(huán)境變量LD_BIND_NOW設(shè)置成一個(gè)非空值,所有的重定位操作都會(huì)在程序啟動(dòng)時(shí)進(jìn)行。也可以在鏈接器命令行通過(guò)使用-z now鏈接器選項(xiàng)使延遲綁定對(duì)某個(gè)特定的共享庫(kù)失效。需要注意的是,除非重新鏈接該共享庫(kù),否則對(duì)該共享庫(kù)的這種設(shè)置會(huì)一直有效。

  3.5.3 初始化(initializing)和終止化(finalizing)函數(shù)

  有時(shí)候,以前的代碼可能用到了兩個(gè)特殊的函數(shù):_init和_fini。_init和_fini函數(shù)用在裝載和卸載某個(gè)模塊(注釋14)時(shí)分別控制該模塊的構(gòu)造器和析構(gòu)器(或構(gòu)造函數(shù)和析構(gòu)函數(shù))。他們的C語(yǔ)言原型如下:

  (代碼)(P74第8行)

  void _init(void);

  void _fini(void);

  當(dāng)一個(gè)庫(kù)通過(guò)dlopen()動(dòng)態(tài)打開(kāi)或以共享庫(kù)的形式打開(kāi)時(shí),如果_init在該庫(kù)中存在且被輸出出來(lái),則_init函數(shù)會(huì)被調(diào)用(注釋15)。如果一個(gè)庫(kù)通過(guò)dlclose()動(dòng)態(tài)關(guān)閉或因?yàn)闆](méi)有應(yīng)用程序引用其符號(hào)而被卸載時(shí),_fini函數(shù)會(huì)在庫(kù)卸載前被調(diào)用。當(dāng)使用你自己的_init和_fini函數(shù)時(shí),需要注意不要與系統(tǒng)啟動(dòng)文件一起鏈接??梢允褂肎CC選項(xiàng)-nostartfiles做到這一點(diǎn)。

 

#p#

但是,使用上面的函數(shù)或GCC的-nostartfiles選項(xiàng)并不是很好的習(xí)慣,因?yàn)檫@可能會(huì)產(chǎn)生一些意外的結(jié)果。相反,庫(kù)應(yīng)該使用__attribute__((constructor))和__attribute__((destructor))函數(shù)屬性來(lái)輸出它的構(gòu)造函數(shù)和析構(gòu)函數(shù)。如下所示:

  (代碼)(P74第21行)

  void __attribute__((constructor)) x_init(void)

  void __attribute__((destructor)) x_fini(void)

  構(gòu)造函數(shù)會(huì)在dlopen()返回前或庫(kù)被裝載時(shí)(注釋16)調(diào)用。析構(gòu)函數(shù)會(huì)在這樣幾種情況下被調(diào)用:dlclose()返回前,或main()返回后,或裝載庫(kù)過(guò)程中exit()被調(diào)用時(shí)。

  3.6 系統(tǒng)調(diào)用

  系統(tǒng)調(diào)用是用戶程序請(qǐng)求內(nèi)核為調(diào)用線程或進(jìn)程提供具體服務(wù)的接口。因?yàn)閁NIX平臺(tái)上的一些系統(tǒng)調(diào)用是與操作系統(tǒng)密切相關(guān)的,因此在Linux上可能不存在類(lèi)似的系統(tǒng)調(diào)用。這種情況下,就需要在Linux上實(shí)現(xiàn)一個(gè)包裹函數(shù)(wrapper)。

  Linux上系統(tǒng)調(diào)用的列表位于/usr/include/asm/unistd.h中。本書(shū)的附錄部分還對(duì)Linux和UNIX系統(tǒng)(如Solaris,HP-UX等)進(jìn)行了并列比較。

  3.7 大頁(yè)面支持

  大頁(yè)面的應(yīng)用主要是用來(lái)提高應(yīng)用程序的性能,該類(lèi)應(yīng)用程序需要分配大塊內(nèi)存并且頻繁訪問(wèn)該內(nèi)存。性能的提高主要是通過(guò)減少地址轉(zhuǎn)換緩沖器 (Translation Lookaside Buffer,簡(jiǎn)寫(xiě)作TLB,一塊虛擬地址到物理地址轉(zhuǎn)換的緩沖區(qū))的未命中次數(shù)來(lái)實(shí)現(xiàn)的。當(dāng)TLB能夠映射更大的虛擬內(nèi)存范圍時(shí),即可減少TLB的未命中次數(shù)。因?yàn)榇蟛糠脂F(xiàn)代的體系結(jié)構(gòu)支持多種頁(yè)面大小,上述方法也就可以實(shí)現(xiàn)了。例如,Intel 32位架構(gòu)支持4KB和4MB(PAE模式時(shí)為2MB)的頁(yè)面;Itanium支持多種頁(yè)面大?。?K,8K,64K,256K,1M,4M,16M和256M;SUN UltraSPARC支持8K,64K,512K和4M的頁(yè)面;64位PowerPC(ppc64)支持4K,64K,16M和64G的頁(yè)面。本節(jié)內(nèi)容將告訴應(yīng)用程序開(kāi)發(fā)人員如何使用Linux內(nèi)核提供的大頁(yè)面支持功能。

  Linux 2.6內(nèi)核包含有內(nèi)建的對(duì)hugetlbpage(Linux社區(qū)稱呼大頁(yè)面的專用術(shù)語(yǔ))的支持。內(nèi)核配置成支持hugetlbpage時(shí),命令cat /proc/meminfo的輸出會(huì)顯示出關(guān)于hugetlbpage的信息,如下例:

  (代碼)(P75倒數(shù)第8行)

  HugePages_Total : 20

  HugePages_Free : 20

  Hugepagesize: 16384 KB

  一種類(lèi)型為hugetlbfs的文件系統(tǒng)也應(yīng)該會(huì)出現(xiàn)在/proc/filesystems中。在用戶空間的應(yīng)用程序能夠使用hugetlbpage支持前,管理員應(yīng)該先在內(nèi)核中分配這些大頁(yè)面。/proc/sys/vm/nr_hugepages的內(nèi)容顯示的是內(nèi)核中當(dāng)前配置的大頁(yè)面的個(gè)數(shù)。如果要在系統(tǒng)上配置10個(gè)大頁(yè)面,可以用下面的命令:

  (代碼)(P76第1行)

  echo 10 > /proc/sys/vm/nr_hugepages

  只有當(dāng)系統(tǒng)中存在足夠的連續(xù)物理內(nèi)存時(shí),分配請(qǐng)求才會(huì)成功;只有存在足夠多的能夠轉(zhuǎn)回到正常內(nèi)存池的空閑大頁(yè)面時(shí),釋放請(qǐng)求才會(huì)成功。用作hugetlbpage的頁(yè)面在內(nèi)核中作為保留頁(yè)面而不能用作其他用途。

  應(yīng)用程序開(kāi)發(fā)人員有兩種方法可以使用hugetlbpage支持:

  1. 系統(tǒng)V共享內(nèi)存系統(tǒng)調(diào)用(shmget,shmat)

  2. mmap系統(tǒng)調(diào)用

  同一個(gè)應(yīng)用程序也可以兩者都使用。

  下面的示例程序中,我們給出了如何使用上述系統(tǒng)調(diào)用來(lái)獲得hugetlbpage支持。這些程序來(lái)源于/usr/src/linux/Documentation/vm/hugetlbpage.txt。

  示例3-2中,應(yīng)用程序使用系統(tǒng)V共享內(nèi)存系統(tǒng)調(diào)用來(lái)申請(qǐng)由大頁(yè)面保留的256M內(nèi)存。shmget系統(tǒng)調(diào)用使用SHM_HUGETLB標(biāo)志告訴內(nèi)核申請(qǐng)的是大頁(yè)面。

  (代碼)(P76-78)

  對(duì)ia86架構(gòu),內(nèi)核為大頁(yè)面保留了一個(gè)特定的內(nèi)存區(qū)域。也就是說(shuō),調(diào)用進(jìn)程必須指定某一個(gè)固定的地址。但對(duì)i386,x86_64,和ppc64不需要一個(gè)固定的地址。

  你也可能需要把每個(gè)共享內(nèi)存段的最大大小增大到256MB。這可以用下面的命令實(shí)現(xiàn):

  (代碼)(P78第26行)

  echo 268435456 > /proc/sys/kernel/shmmax

  還需要關(guān)注的另一個(gè)限制是/proc/sys/kernel/shmall,它顯示的是系統(tǒng)中可以創(chuàng)建的共享內(nèi)存的總頁(yè)數(shù)。

  mmap system call

  這種情況下,需要管理員首先掛載一個(gè)hugetlbfs類(lèi)型的文件系統(tǒng),然后在該掛載點(diǎn)上創(chuàng)建的所有文件都保存在大頁(yè)面上。

  (代碼)(P78第33行)

  mount none /mnt/huge –t hugetlbfs –o uid=1000,gid=100

  上述命令在目錄/mnt/huge上掛載一個(gè)hugetlbfs類(lèi)型的文件系統(tǒng),并把該文件系統(tǒng)的根目錄的所有者和組分別設(shè)置成1000和100。程序3-3給出了一個(gè)使用mmap系統(tǒng)調(diào)用申請(qǐng)由大頁(yè)面保留的256MB內(nèi)存的示例。

  (代碼)(P79-80)

  注意,對(duì)hugetlbfs文件系統(tǒng)上的文件,read和write系統(tǒng)調(diào)用是不支持的。通常的chown,chgrp和chmod(如果有權(quán)限的話)可以用來(lái)改變hugetlbfs文件系統(tǒng)上文件的屬性。

【編輯推薦】

  1. Linux集群基礎(chǔ)
  2. Opera將推出Mobile Linux
  3. 玩轉(zhuǎn)linux之二-驅(qū)動(dòng)開(kāi)發(fā)技術(shù)探析
責(zé)任編輯:龐桂玉 來(lái)源: ChinaITLab
相關(guān)推薦

2009-09-18 12:50:02

Nis服務(wù)器

2010-03-03 13:20:56

2011-06-07 10:15:38

GNULinux

2010-01-22 11:06:03

GNUkFreeBSDLinux

2009-06-29 09:44:39

LinuxDebianGNU

2009-12-14 13:31:56

GNULinuxvmware

2009-12-10 16:26:49

GNULinux

2017-03-01 12:52:49

GNULinux

2013-12-18 13:39:34

LinuxGNU

2009-10-23 18:47:35

GNULinux

2009-12-15 11:18:38

GNULinux安裝vmwa

2010-01-06 16:47:53

Linux內(nèi)核

2014-09-22 10:06:07

2013-04-10 10:59:45

Linux系統(tǒng)監(jiān)控collectl

2009-12-18 09:48:26

Linux中應(yīng)用

2015-09-15 11:13:52

光盤(pán)Parsix GNULinux

2011-04-20 09:48:44

2010-06-04 17:37:45

Linux編程工具

2018-08-17 16:37:13

Linux內(nèi)核開(kāi)源

2022-06-14 09:33:15

LinuxGNU Emacs命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)