天天看點

第二章 嵌入式作業系統_autotools&vmalloc

1.對于大型的項目,Makefile檔案的編寫是一件比較繁瑣的事情,是以現在Linux上的軟體開發一般都用autotools來制作Makefiles。

2.autotools的使用流程

(1)autoscan

   它會在給定目錄及其子目錄樹中檢查源檔案,若沒有給出目錄,就在目前目錄及其子目錄樹中進行檢查。它會搜尋源檔案以尋找一般的移植性問題并建立一個檔案“configure.scan”,該檔案就是接下來autoconf要用到的“configure.in”原型。這個工具會生成一個“configure.in”的原型檔案“configure.scan”。

(2)将“configure.scan”改名為“configure.in”,并對其中的内容作如下的修改:

   以“#”号為開始的行為注釋。

   AC_PREREQ宏聲明本檔案要求的autoconf版本。

   AC_INIR宏用來定義軟體的名稱和版本等資訊。

   AM_INIT_AUTOMAKE是需要添加的内容,它是automake所必備的宏,也同前面一樣,PACKAGE是所要産生軟體套件的名稱,VERSION是版本編号。

   AC_CONFIG_SRCDIR宏用來偵測所指定的源碼檔案是否存在,在此來确定源碼目錄的有效性。

   AC_CONFIG_HEADER宏用于生成config.h檔案,以便autoheader使用。

   AC_CONFIG_FILES宏用于生成相應的Makefile檔案。

(3)運作aclocal,生成一個“aclocal.m4”檔案,該檔案主要是處理本地的宏定義。

(4)使用autoheader指令,它負責生成config.h.in檔案。該工具通常會從acconfig.h檔案中複制使用者附加的符号定義。

(5)automake

   這是建立Makefile很重要的一步,automake要用的腳本配置檔案是Makefile.am,使用者需要自己建立相應的檔案。然後,automake工具轉換成Makefile.in。Makefile.am檔案的内容如下:

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=hello

hello_SOURCES=hello.c

下面對該腳本檔案的對應項進行解釋:

A.其中的AUTOMAKE_OPTIONS為設定automake的選項。由于GNU對自己釋出的軟體有嚴格的規範,如必須附帶許可證聲明檔案COPYING等,否則automake執行時會報錯。automake提供了3種軟體等級:foreign、gnu和gnits,預設等級為gnu。

B.bin_PROGRAMS定義要産生的執行檔案名。如果要産生多個可執行檔案,每個檔案名用空格隔開。

C.hello_SOURCES定義了“hello”這個執行程式鎖需要的原始檔案。如果“hello”這個程式是由多個原始檔案所産生的,則必須把它們所用到的所有原始檔案都列出來,并用空格隔開。如果要定義多個執行檔案,則對每個執行程式都要定義相應的file_SOURCES。

添加完Makefile.am之後,執行指令

# automake --add-missing

這個指令來生成Makefile.in檔案,這裡使用“--add-missing”是為了讓automake自動添加一些必需的腳本檔案。

(6)運作configure

   這一步中,通過運作自動配置設定檔案configure,把Makefile.in變成最終的Makefile。

3.使用automake生成的Makefile

(1)在指令行輸入指令

# make

則預設執行“make all”指令,即目标體為all。

(2)在指令行輸入指令

# make install

此時,會把該程式安裝到系統目錄中去

(3)在指令行輸入指令

# make clean

此時,make會清除之前所編譯的可執行檔案及目标檔案。

(4)在指令行輸入指令

# make dist

此時,make将程式和相關的文檔打包為一個壓縮文檔以供釋出。

4.記憶體區域Zone

ZONE_DMA包含可以用來執行DMA操作的記憶體。

ZONE_NORMAL包含可以正常映射到虛拟位址的記憶體區域。

ZONE_HIGHMEM包含不能永久映射到核心位址空間的記憶體區域。

5.高端記憶體和虛拟記憶體

Linux在初始化時總是盡可能地将所有的實體記憶體映射到核心位址空間中去。如果核心位址空間起始于(0xC0000000),為vmalloc保留的虛拟位址空間是128M,那麼最多隻能有(1GB–128M)的實體記憶體直接映射到核心空間,核心可以直接通路。如果還有更多的實體記憶體,就稱為高端記憶體,核心不能直接通路,隻能通過修改頁表映射後才能進行通路。

   申請和釋放較小且連續的記憶體空間時,使用kmalloc()和kfree()函數在實體記憶體中進行配置設定;申請較大的記憶體空間時,可以使用vmalloc()函數。由vmalloc()函數申請的記憶體空間在虛拟記憶體中是連續的,它們映射到實體記憶體時,可以使用不連續的實體頁面,而且僅把目前通路的部分放在實體頁面中。

   使用vmalloc時應将包含進來。與其他記憶體配置設定函數不同的是,vmalloc傳回很“高”的位址值——這些位址要高于實體記憶體的頂部。vmalloc配置設定的核心虛拟記憶體與kmalloc/__get_free_pages配置設定的核心邏輯記憶體位于不同的區間,不會重疊。因為核心空間被分區管理,各司其職。使用者空間被配置設定在0~3GB之間,3GB之後緊随着的是實體記憶體映射區間,然後才是vmalloc_start開始的用于vmalloc配置設定記憶體的位址空間。用vmalloc配置設定的記憶體空間使用vfree釋放。對vmalloc和ioremap函數可配置設定的記憶體空間大小并沒有什麼限制,但是為了能夠檢測到程式員犯的一些錯誤,vmalloc不允許配置設定超過實體記憶體大小的記憶體空間。

繼續閱讀