- 一步步寫嵌入式操作系統
- 李無言著
- 1546字
- 2018-12-29 16:24:53
1.2.1 編譯器的選擇和安裝
由于我們的操作系統需要運行在ARM體系結構中。因此,在琳瑯滿目的ARM編譯器中選擇出一款,用來編譯操作系統源程序,就成為了必須先要解決的問題。于是我們選擇了GCC。
GCC的大名,相信讀者應該都會如雷貫耳。簡單地說,GCC就是由GNU基金會組織開發的一套開源的編譯器。根據相關許可,我們可以自由地下載和使用這套編譯器,可以隨意地修改和重新發布它的源代碼,整個過程不需要付一分錢或承擔任何責任。這就是我們選擇GCC作為開發工具的一個最主要的原因。
GCC的免費獲得和使用并不等于質量低劣或功能欠缺。它的功能不遜于任何一款商用ARM編譯器。這也是我們選擇GCC作為操作系統開發工具的第二個原因。
接下來我們就來介紹一下GCC編譯器的安裝過程。
GCC是源碼開放的,所以理論上,我們完全可以去網站上下載GCC源代碼,然后在本地進行編譯,生成一個能夠編譯ARM體系結構下程序的工具。
這個過程聽起來似乎輕而易舉,但做起來卻沒有那么容易。況且也沒有太大的必要自己生成編譯器。因此,本書不會對這一部分內容進行介紹。如果讀者確實對自己構建編譯器很感興趣,可以去“www.leeos.org”上翻閱相關文檔。
其實,這個問題遠遠沒有那么復雜。編譯器也只不過是一套軟件而已,別人編譯好的,拿到我們的系統中一樣可以使用。
通常我們會看到網上有許多名為“arm-Linux-gcc”或“arm-elf-gcc”的編譯工具。使用這些工具來編譯屬于我們自己的操作系統,基本上都是可以的。
讀者也許會提出這樣的疑問,為什么這些編譯器的名字有些與眾不同呢?其實,這些編譯器的命名方法有些約定俗成的規矩,例如,開頭的“arm”關鍵字表示該編譯器將生成ARM體系結構機器碼,而中間的“Linux”或“elf”則表示應用的目標平臺。一般說來,“Linux”關鍵字意味著該編譯器在編譯時針對Linux系統做了特定的優化,生成的代碼將更好地運行在Linux系統之中,而“elf”關鍵字則更適合生成通常的可執行程序代碼。對于我們自己的操作系統來說,使用“arm-elf-gcc”這套工具顯然更合適一些。與傳統的PC程序開發不同,嵌入式的開發過程通常都是在PC中對源代碼進行編譯,再將編譯生成的可執行程序放到嵌入式平臺中去運行,因此有人把這種編譯過程稱作交叉編譯或跨平臺編譯,而將一整套用于交叉編譯的工具稱為交叉編譯工具鏈。
為了方便讀者對本書代碼進行實踐,我們制作好了一套專門用于這套操作系統的編譯器,大家可以去“www.leeos.org”網站上下載使用。
需要注意的是,這樣的一套編譯工具只能用來編譯我們自己寫的操作系統,不能保證編譯其他ARM應用程序的正確性,包括Linux下的程序和內核。這是因為在制作這套工具的過程中,為了能讓編譯器盡可能小一些,我們沒有添加任何標準C函數庫和其他一些GCC擴展工具,對于我們自己的操作系統來說,這樣做并無問題。也就是說,通常情況下,一個操作系統的核心代碼并不需要第三方函數庫,但這個假設對于絕大多數應用程序來說卻并不成立。
當下載到某一個版本的交叉編譯工具之后,第一步要做的就是將其解壓。以我們所提供的交叉編譯工具鏈為例,Windows用戶可以運行如下命令。
命令1-1
tar zxvf leeos_tools_for_Cygwin.tar.gz
當然這需要首先將下載的編譯工具復制到某一目錄中,如果讀者將Cygwin安裝到了C盤的話,這個目錄可以是“C:\Cygwin\usr”,然后打開Cygwin命令行,運行下面的命令。
命令1-2
cd /usr
這樣,我們就可以使用命令1-1,將安裝工具解壓到“usr”目錄下。此時雖然解壓過程已經完成,但并不表示編譯器已經可以使用,我們還需運行如下命令才能將編譯器徹底地安裝到系統中。
命令1-3
echo "PATH=\$PATH:/usr/leeos_tools_for_Cygwin/bin">>/etc/profile
對于Linux用戶,步驟基本是一樣的。但需要注意的是這些命令需要以超級用戶的身份去運行。使用命令1-4可以進行超級用戶的切換。
命令1-4
su
使用su命令后,終端會提示輸入超級用戶密碼。用戶切換完成后,就可以使用cp命令將下載的編譯工具復制到“/usr”目錄中。
命令1-5
cp /where/your/compiler/locate/leeos_tools_for_Linux.tar.gz /usr
接下來運行命令1-2,然后是命令1-1和命令1-3。注意,要將“leeos_tools_for_Cygwin”改成“leeos_tools_for_Linux”。重啟系統后,交叉編譯工具就可以使用了。