資源描述:
《ubuntu linux》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、UbuntuLinux 除了libc和libm庫,UNIX系統(tǒng)庫沒有其他標(biāo)準(zhǔn)的命名規(guī)范。Linux上的一些系統(tǒng)庫可能和UNIX平臺上庫的名稱不同,這就需要知道Linux上各庫所包含和支持的功能。表3-2根據(jù)所支持的功能列舉了一些Linux系統(tǒng)庫。 下面列出了GNUlibc庫所包含的庫文件以及對應(yīng)的描述(程序不需要任何改動就可以在后續(xù)版本上運(yùn)行。庫版本化就是Linux以及同期的其他操作系統(tǒng)實(shí)現(xiàn)二進(jìn)制兼容性的方法?! ∥覀円郧耙浦策^的一些應(yīng)用程序需要庫版本化的支持。各UNIX平臺也都實(shí)現(xiàn)了庫版本化
2、,但實(shí)現(xiàn)的方法不盡相同。Linux提供了兩種不同的技術(shù)來實(shí)現(xiàn)庫版本化:外部庫版本化和符號版本化。 3.4.1外部庫版本化 鏈接過程中,鏈接器(ld)會查找以.so結(jié)尾的共享庫文件。以.so結(jié)尾的庫文件叫鏈接器名稱,這是由他們在Linux上的使用方式?jīng)Q定的。當(dāng)編譯一個依賴某一共享庫的應(yīng)用程序時,僅僅是該共享庫的soname(不是共享庫的文件名)作為依賴關(guān)系被記錄在應(yīng)用程序的二進(jìn)制代碼中。運(yùn)行時鏈接器就是使用共享庫的soname來查找和裝載該庫的。共享庫的soname只包含有大版本號(例如,lib
3、foo.so.1) 當(dāng)修改后的共享庫與以前版本不兼容時,新的共享庫必須有一個新的外部版本名稱。也就是說,該庫的soname必須改變。這些不兼容的修改包括:刪除一個符號,去掉某函數(shù)的一個參數(shù),改變了某函數(shù)的語義屬性以致與以前的定義不再一致并且與老版本二進(jìn)制不兼容等等。我們來看下面的例子。(見pdf附件341.pdf) 3.4.2符號版本化 就像前面所提到的,當(dāng)對共享庫所作的修改能夠向前兼容時,我們只增大小版本號。這種修改包括增加一些新的接口同時又不改變已有的接口。但是,即使只做這種小版本的修改
4、,也會出現(xiàn)一個很重要的問題:一個在某一小版本的共享庫上編譯的應(yīng)用程序并不一定能夠在以前小版本的庫上運(yùn)行。這是因?yàn)樵搼?yīng)用程序可能使用了新增加的、以前小版本的庫中沒有的接口。為了解決這個問題,引入了符號版本化。符號版本化允許共享庫記錄下每個小版本都新增了什么內(nèi)容?! ≡贚inux上,GNUld可以使用-version-script連接器選項(xiàng)來創(chuàng)建符號版本化的共享庫。編譯器選項(xiàng)-apfile告訴鏈接器哪些符號要從生成的共享庫中輸出出來。每個符號分屬global(被輸出)和local(不被輸出)兩類中的一
5、種。來看下面的例子。foo.c包含一個函數(shù)foo1,該文件用來創(chuàng)建1.1版本的共享庫。(見附件示例代碼.pdf) 可以看到,這次main只引用了版本化庫的LX_1.1?! NUld還允許在定義符號的源文件中把符號綁定到某一版本中,而不僅僅是在腳本文件中指定。另外,GNUld還允許同一函數(shù)的多個版本出現(xiàn)在同一個共享庫中。更多詳細(xì)信息,請參考GNUld手冊(應(yīng)用程序調(diào)用時,共享庫才會被裝載,否則不會裝載,因此會節(jié)約一些系統(tǒng)資源。但是如果把環(huán)境變量LD_BIND_NOB(PAE模式時為2MB)的頁面
6、;Itanium支持多種頁面大小:4K,8K,64K,256K,1M,4M,16M和256M;SUNUltraSPARC支持8K,64K,512K和4M的頁面;64位Poeminfo的輸出會顯示出關(guān)于hugetlbpage的信息,如下例: (代碼)(P75倒數(shù)第8行) HugePages_Total:20 HugePages_Free:20 Hugepagesize:16384KB 一種類型為hugetlbfs的文件系統(tǒng)也應(yīng)該會出現(xiàn)在/proc/filesystems中。在用戶空間的應(yīng)用
7、程序能夠使用hugetlbpage支持前,管理員應(yīng)該先在內(nèi)核中分配這些大頁面。/proc/sys/vm/nr_hugepages的內(nèi)容顯示的是內(nèi)核中當(dāng)前配置的大頁面的個數(shù)。如果要在系統(tǒng)上配置10個大頁面,可以用下面的命令: (代碼)(P76第1行) echo10>/proc/sys/vm/nr_hugepages 只有當(dāng)系統(tǒng)中存在足夠的連續(xù)物理內(nèi)存時,分配請求才會成功;只有存在足夠多的能夠轉(zhuǎn)回到正常內(nèi)存池的空閑大頁面時,釋放請求才會成功。用作hugetlbpage的頁面在內(nèi)核中作為保留
8、頁面而不能用作其他用途?! ?yīng)用程序開發(fā)人員有兩種方法可以使用hugetlbpage支持: 1.系統(tǒng)V共享內(nèi)存系統(tǒng)調(diào)用(shmget,shmat) 2.mmap系統(tǒng)調(diào)用 同一個應(yīng)用程序也可以兩者都使用。 下面的示例程序中,我們給出了如何使用上述系統(tǒng)調(diào)用來獲得hugetlbpage支持。這些程序于/usr/src/linux/Documentation/vm/hugetlbpage.txt?! ∈纠?-2中,應(yīng)用程序使用系統(tǒng)V共享內(nèi)存系統(tǒng)調(diào)用來申請由大頁面保留的256M內(nèi)存。