X86架構的CPU採用的是複雜指令集(Complex Instruction Set Computer,CICS),而ARM架構的CPU使用的是精簡指令集(Reduced Instruction Set Computer,RISC)。由於這兩種架構的CPU使用了不同的指令集,因此在X86架構上開發可運行在ARM架構上的程式就必須要使用交叉編譯器。通常交叉編譯器和相關工具包含的了很多可執行檔以及大量的共用庫及標頭檔等資源。這些資源的集合稱為交叉編譯環境。
在Internet上可以找到整合好的交叉編譯環境,Android NDK和Android原始碼中也包含的交叉編譯環境。當然,如果我們需要一個完全獨立的交叉編譯環境,可以下載整合好的交叉編譯環境,也可以自己製作(比較複雜,建議讀者下載整合好的交叉編譯環境)。下面介紹一個CodeSourcery交叉編譯環境,這個交叉編譯環境直接下載安裝就可以安裝。
讀者可通過如下的網站訪問CodeSourcery下載頁面。
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
上面的頁面並未直接提供CodeSourcery的下載連結,讀者可以點擊“Download the GNU/Linux Release”連結,並輸入Email(建議使用Gmail)、地址等資訊,最後點擊“Get Lite!”按鈕提交資訊。2-29所示。最後系統會將發送到剛才輸入的Email。
進入下載頁面,會看到2-30所示的不同版本的下載連結,選擇最新的版本即可。
圖2-30 CodeSourcery的不同版本
進入CodeSourcery的下載頁面後,會看到2-31所示的下載連結。目前CodeSourcery有Windows和Linux兩個版本。本書使用的是第1個(IA32 GNU/Linux Installer)。
Linux版本的安裝檔案是bin格式,讀者可執行下面的命令安裝CodeSourcery。其中package表示CodeSourcery的安裝檔案名稱。
sh package.bin
執行上面的命令後,會顯示可視化的安裝介面,2-32所示,讀者可按提示安裝CodeSourcery。
為了使用方便,建議讀者將如下路徑加到PATH環境變數中。
/root/compilers/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin
下面編寫一個簡單的C程式來測試一下這個交叉編譯環境。
// first.c#include <stdio.h>int main(){ printf("first arm program\n"); return 0;}
輸入下面的命令編譯first.c檔案(需要加-static選項)。
# arm-none-linux-gnueabi-gcc -static -o first first.c
輸入下面的命令將first檔案上傳到任意的Android裝置的/data/local目錄中(沒有root許可權也可以)。
# adb push first /data/local
使用adb shell命令進入Android裝置的控制台,並進入/data/local目錄,執行如下的命令
# ./first
執行上面的命令就會輸出“first arm program”資訊。first程式在X86架構上啟動並執行Ubuntu Linux中是無法啟動並執行。讀者可以試著在Ubuntu Linux中運行first程式,看看會發生什麼。
注意:在安裝Code Sourcery的過程中會在/lib目錄尋找一個libc.so.6庫檔案,但在Ubuntu Linux11.04及以上版本/lib目錄已經沒有libc.so.6庫檔案了。這個庫檔案被放在了其他的目錄。在32位的Ubuntu Linux中該檔案的路徑是/lib/i386-linux-gnu/libc.so.6,在64位的Ubuntu Linux中該檔案的路徑是/lib/x86_64-linux-gnu/libc.so.6。在安裝Code Sourcery之前可以使用ln命令為libc.so.6檔案在/lib目錄建立一個連結。
本文節選至《Android深度探索(卷1):HAL與驅動開發》,接下來幾篇文章將詳細闡述如何開發ARM架構的Linux驅動,並分別利用android程式、NDK、可執行檔測試Linux驅動。可在ubuntu Linux、Android模擬器和S3C6410開發板(可以選購OK6410-A開發板,需要刷Android)