arm的歷史
ARM的設計是艾康計算機公司于1983年開始的開發項目。
這個團隊由Roger Wilson和Steve Furber帶領,著手開發一種類似高級6502架構的處理器。Acorn計算機有一大堆建構在6502處理器上的計算機,因此能設計出一顆類似的芯片即意味著對公司有很大的優勢。
Acorn RISC Machine:ARM2
用在BBC Micro上的ARM1 second processor
團隊在1985年時開發出樣本“ARM1”,而首顆真正能量產的“ARM2”于次年投產。ARM2具有32位的數據總線、26位的定址空間,并提供64 Mbyte的定址范圍與16個32-bit的寄存器。寄存器中有一個作為程序計數器,其前面6位和后面2位用來保存處理器狀態標記。ARM2可能是全世界最簡單實用的32位微處理器,僅容納了30,000個晶體管(六年后的摩托羅拉68000包含了70,000顆)。之所以精簡的原因在于它不含微碼(這大概占了68000的晶體管數約1/4至1/3);而且與當時大多數的處理器相同,它沒有包含任何的高速緩存。這個精簡的特色使它只需消耗很少的電能,卻能發揮比Intel 80286更好的性能[10]。后繼的處理器“ARM3”則備有4KB的高速緩存,使它能發揮更佳的性能。
Apple、DEC、Intel、Marvell:ARM6、StrongARM、XScale[編輯]
在1980年代晚期,蘋果計算機開始與艾康計算機合作開發新版的ARM核心。由于這項目非常重要,艾康計算機甚至于1990年將設計團隊另組成一間名為安謀國際科技(Advanced RISC Machines Ltd.)的新公司。也基于這原因,使得ARM有時候反而稱作Advanced RISC Machine而不是Acorn RISC Machine。由于其母公司ARM Holdings plc于1998年在倫敦證券交易所和NASDAQ掛牌上市[11],使得Advanced RISC Machines成了ARM Ltd旗下擁有的產品[12]。
這個項目到后來進入“ARM6”,首版的樣品在1991年發布,然后蘋果計算機使用ARM6架構的ARM 610來當作他們Apple Newton產品的處理器。在1994年,艾康計算機使用ARM 610做為他們個人計算機產品的處理器。
在這些變革之后,內核部分卻大多維持一樣的大小——ARM2有30,000顆晶體管,但ARM6卻也只增長到35,000顆。主要概念是以ODM的方式,使ARM核心能搭配一些選配的零件而制成一顆完整的CPU,而且可在現有的晶圓廠里制作并以低成本的方式達到很大的性能。
ARM的經營模式在于出售其IP核,授權廠家依照設計制作出建構于此核的微控制器和中央處理器。最成功的實現案例屬ARM7TDMI,幾乎賣出了數億套內置微控制器的設備。
Digital曾購買這個架構的產權并研發出“StrongARM”。在233 MHz的頻率下,這顆CPU只消耗1瓦特的電能(后來的芯片消耗得更少)。這項設計后來為了和英特爾的控訴和解而技術移轉,英特爾因而利用StrongARM架構補強他們老舊的i960產品。英特爾后來開發出他們自有的高性能架構產品XScale,之后賣給了邁威爾科技。
支持智能手機、個人數碼助理和其他手持設備最常見的架構是“ARMv4”。XScale和ARM926處理器是“ARMv5TE”,而且比起建構在ARMv4的StrongARM、ARM925T和ARM7TDMI等處理器還更常見于許多高端設備上[來源請求]。
內核種類
ARMv1?ARM1
ARMv2?ARM2、ARM3
ARMv3 ARM6、ARM7
ARMv4?StrongARM、ARM7TDMI、ARM9TDMI
ARMv5?ARM7EJ、ARM9E、ARM10E、XScale
ARMv6?ARM11、ARM Cortex-M
ARMv7?ARM Cortex-A、ARM Cortex-M、ARM Cortex-R
ARMv8(A) Cortex-A35、Cortex-A50系列[13]、Cortex-A72、Cortex-A73、Cortex-A75、Cortex-A76
架構
從1995年開始,《ARM體系結構參考手冊》是ARM文檔的主要來源,提供了關于ARM處理器架構和指令集,區分接口,所有的ARM處理器的支持(如指令語義)的實現細節可能會有所不同。該體系結構隨著時間的演變,并與Cortex系列的核心開始,存在三個“配置”的定義如下:
"應用"配置: Cortex-A 系列
"嵌入式"配置: Cortex-R 系列
"微處理器"配置:?ARM Cortex-M?系列。
每個配置允許有其子集的架構。
CPU模式
CPU ARM架構指定了以下的CPU模式。在任何時刻,CPU只可處于某一種模式,但可由于外部事件(中斷)或編程方式進行模式切換。
用戶模式僅非特權模式。
系統模式僅無需例外進入的特權模式。僅以執行明確寫入CPSR的模式位的指令進入。Supervisor (svc) 模式在CPU被重置或者SWI指令被執行時進入的特權模式。
Abort 模式預讀取中斷或數據中斷異常發生時進入的特權模式。
未定義模式未定義指令異常發生時進入的特權模式。
干預模式處理器接受一條IRQ干預時進入的特權模式。
快速干預模式處理器接受一條IRQ干預時進入的特權模式。
Hyp 模式armv-7a為cortex-A15處理器提供硬件虛擬化引進的管理模式。
最新的armv8A arm64 與aarch64
在找交叉編譯鏈過程中被這三個困惑好久,在選擇之前一定要先搞明白這三者的關系
ARM在2007年已著手設計工作,并于2011年11月公報ARMv8A 64bit指令集架構,耗用了4年的研發時間。
ARMv8A分為A64及A32兩個部分,A64顧名思義屬于64bit的部份,主要存在于AARCH64的狀態。而A32又稱AARCH32狀態,用作支持現有A32 ARM指令集。ARM并沒有采用AMD x86-64及Intel EM64T擴充32bit指令做法,而是選擇全新開發專用的64bit指令。據ARM方面表示,這一做法與省電的考慮有關,當運行64bit ISA時,ARMv7電路可處于閑置狀態,節省功耗。同A64 ISA也移除了作用不大的LDM/STM(load/store multiple)指令,改為LD/ST ’P’指令,以降低復雜性及功耗,與此同時,32bit到64bit狀態轉換采用Inter-processing的做法,確保32bit到64bit指令皆可順利執行。
armv8A架構又細分為armv8.2a、armv8.3a、armv8.4a、armv8.5a。
在今年的Computex上arm公布了2018年的Cortex-A旗艦CPU,Cortex-A76. 這個CPU的微構架做了徹底的重新設計,它重點提高了峰值性能,同時良好地保持了性能功耗比。Cortex-A76將arm CPU的性能推上了一個新高度。Cortex-A76還是armv8.2-a構架實現,與現有的處理兼容,還是使用DSU技術,到時微構架的重新設計使得它比Cortex-A75平均有35%的性能提升,且有40%的能耗比提升。對浮點數和機器學習運算任務提升最大。麒麟980用的性能核心就是公版Cortex-A76.
Cortex-A76是第一個開始逐漸去除32bit支持的CPU。A76還是支持aarch32,但是只是在最低特權級的EL0支持,而aarch64在EL0-EL3都支持-從OS到底層的固件。在將來某個時候,arm非常有可能完全只支持64 bit,這取決于arm生態系統的發展。
arm授權方式
ARM公司本身并不靠自有的設計來制造或出售CPU,而是將處理器架構授權給有興趣的廠家。ARM提供了多樣的授權條款,包括售價與散播性等項目。對于授權方來說,ARM提供了ARM內核的集成硬件敘述,包含完整的軟件開發工具(編譯器、debugger、SDK),以及針對內含ARM CPU硅芯片的銷售權。對于無晶圓廠的授權方來說,其希望能將ARM內核集成到他們自行研發的芯片設計中,通常就僅針對獲取一份生產就緒的智財核心技術(IP Core)認證。
許多半導體公司持有ARM授權:Atmel、Broadcom、Cirrus Logic、Freescale(于2004從摩托羅拉公司獨立出來)、富士通、英特爾(借由和Digital的控訴調停)、IBM、NVIDIA、臺灣新唐科技(Nuvoton Technology)、英飛凌、任天堂、恩智浦半導體(于2006年從飛利浦獨立出來)、OKI電氣工業、三星電子、Sharp、STMicroelectronics、德州儀器和VLSI等許多這些公司均擁有各個不同形式的ARM授權。雖然ARM的授權項目由保密合約所涵蓋,在知識產權工業,ARM是廣為人知最昂貴的CPU內核之一。單一的客戶產品包含一個基本的ARM內核可能就需索取一次高達美金20萬的授權費用。而若是牽涉到大量架構上修改,則費用就可能超過千萬美元。
交叉編譯鏈選擇
以上都是廢話,重點關注armv8a即可。armv8a分為aarch32與aarch64兩種模式。因此在選擇交叉編譯鏈時一定要確定自己運行的arm設備是什么架構,什么模式。
從授權上,交叉編譯鏈分為免費授權版和付費授權版。
免費版目前有三大主流工具商提供,第一是GNU(提供源碼,自行編譯制作),第二是 Codesourcery,第三是Linora。
收費版有ARM原廠提供的armcc、IAR提供的編譯器等等,因為這些價格都比較昂貴,不適合學習用戶使用,所以不做講述。
arm-none-linux-gnueabi-gcc:是 Codesourcery 公司(目前已經被Mentor收購)基于GCC推出的的ARM交叉編譯工具。可用于交叉編譯ARM(32位)系統中所有環節的代碼,包括裸機程序、u-boot、Linux kernel、filesystem和App應用程序。
arm-linux-gnueabihf-gcc:是由 Linaro 公司基于GCC推出的的ARM交叉編譯工具。可用于交叉編譯ARM(32位)系統中所有環節的代碼,包括裸機程序、u-boot、Linux kernel、filesystem和App應用程序。
aarch64-linux-gnu-gcc:是由 Linaro 公司基于GCC推出的的ARM交叉編譯工具。可用于交叉編譯ARMv8 64位目標中的裸機程序、u-boot、Linux kernel、filesystem和App應用程序。
arm-none-elf-gcc:是 Codesourcery 公司(目前已經被Mentor收購)基于GCC推出的的ARM交叉編譯工具。可用于交叉編譯ARM MCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。
arm-none-eabi-gcc:是 GNU 推出的的ARM交叉編譯工具。可用于交叉編譯ARM MCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。
命名規則
交叉編譯工具鏈的命名規則為:arch [-vendor] [-os] [-(gnu)eabi]
arch – 體系架構,如ARM,MIPS(通過交叉編譯工具生成的可執行文件或系統鏡像的運行平臺或環境)
vendor – 工具鏈提供商
os – 目標操作系統(host主要操作平臺,也就是編譯時的系統)
eabi – 嵌入式應用二進制接口(Embedded Application Binary Interface)
根據對操作系統的支持與否,ARM GCC可分為支持和不支持操作系統,如
arm-none-eabi:這個是沒有操作系統的,自然不可能支持那些跟操作系統關系密切的函數,比如fork(2)。他使用的是newlib這個專用于嵌入式系統的C庫。
arm-none-linux-eabi:用于Linux的,使用Glibc
linaro交叉編譯鏈簡介
以下面的鏈接為例,分析下各個文件的作用。http://releases.linaro.org/components/toolchain/binaries/5.5-2017.10/aarch64-linux-gnu/。該目錄下面列出了一些列的交叉編譯工具:
gcc-linaro-5.5.0-2017.10-i686-mingw32_aarch64-linux-gnu.tar.xz27-Feb-2018 00:17234.0Mopen
運行在32位x86windows主機的aarch64支持linux系統的交叉編譯鏈。
gcc-linaro-5.5.0-2017.10-i686_aarch64-linux-gnu.tar.xz27-Feb-2018 00:1789.0Mopen
運行在32位x86linux主機的aarch64位支持linux系統的交叉編譯鏈。
gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz27-Feb-2018 00:1789.9Mopen
運行在64位linux主機的aarch64位支持linux系統的交叉編譯鏈。這個正是我要找的交叉編譯鏈。
runtime-gcc-linaro-5.5.0-2017.10-aarch64-linux-gnu.tar.xz28-Jan-2018 17:326.2Mopen
runtime-gcc-linaro-5.5.0-2017.10-aarch64-linux-gnu.tar.xz.asc28-Jan-2018 17:3292open
sysroot-glibc-linaro-2.21-2017.10-aarch64-linux-gnu.tar.xz27-Feb-2018 00:1833.6Mopen
sysroot-glibc-linaro-2.21-2017.10-aarch64-linux-gnu.tar.xz.asc
這個runtime以及sysroot-glibc暫時不確定是做什么用的。
再補充點交叉編譯鏈的東西:
實例
1、arm-none-eabi-gcc
(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)
用于編譯 ARM 架構的裸機系統(包括 ARM Linux 的 boot、kernel,不適用編譯 Linux 應用 Application),一般適合 ARM7、Cortex-M 和 Cortex-R 內核的芯片使用,所以不支持那些跟操作系統關系密切的函數,比如fork(2),他使用的是 newlib 這個專用于嵌入式系統的C庫。
2、arm-none-linux-gnueabi-gcc
(ARM architecture, no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI)
主要用于基于ARM架構的Linux系統,可用于編譯 ARM 架構的 u-boot、Linux內核、linux應用等。arm-none-linux-gnueabi基于GCC,使用Glibc庫,經過 Codesourcery 公司優化過推出的編譯器。arm-none-linux-gnueabi-xxx 交叉編譯工具的浮點運算非常優秀。一般ARM9、ARM11、Cortex-A 內核,帶有 Linux 操作系統的會用到。
3、arm-eabi-gcc
Android ARM 編譯器。
4、armcc
ARM 公司推出的編譯工具,功能和 arm-none-eabi 類似,可以編譯裸機程序(u-boot、kernel),但是不能編譯 Linux 應用程序。armcc一般和ARM開發工具一起,Keil MDK、ADS、RVDS和DS-5中的編譯器都是armcc,所以 armcc 編譯器都是收費的(愛國版除外,呵呵~~)。
5、arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc
arm-none-uclinuxeabi 用于uCLinux,使用Glibc。
arm-none-symbianelf 用于symbian,沒用過,不知道C庫是什么 。
Codesourcery
Codesourcery推出的產品叫Sourcery G++ Lite Edition,其中基于command-line的編譯器是免費的,在官網上可以下載,而其中包含的IDE和debug 工具是收費的,當然也有30天試用版本的。
目前CodeSourcery已經由明導國際(Mentor Graphics)收購,所以原本的網站風格已經全部變為 Mentor 樣式,但是 Sourcery G++ Lite Edition 同樣可以注冊后免費下載。
Codesourcery一直是在做ARM目標 GCC 的開發和優化,它的ARM GCC在目前在市場上非常優秀,很多 patch 可能還沒被gcc接受,所以還是應該直接用它的(而且他提供Windows下[mingw交叉編譯的]和Linux下的二進制版本,比較方便;如果不是很有時間和興趣,不建議下載 src 源碼包自己編譯,很麻煩,Codesourcery給的shell腳本很多時候根本沒辦法直接用,得自行提取關鍵的部分手工執行,又費精力又費時間,如果想知道細節,其實不用自己編譯一遍,看看他是用什么步驟構建的即可,如果你對交叉編譯器感興趣的話。
ABI 和 EABI
ABI:二進制應用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在計算機中,應用二進制接口描述了應用程序(或者其他類型)和操作系統之間或其他應用程序的低級接口。
EABI:嵌入式ABI。嵌入式應用二進制接口指定了文件格式、數據類型、寄存器使用、堆積組織優化和在一個嵌入式軟件中的參數的標準約定。開發者使用自己的匯編語言也可以使用 EABI 作為與兼容的編譯器生成的匯編語言的接口。
兩者主要區別是,ABI是計算機上的,EABI是嵌入式平臺上(如ARM,MIPS等)。
arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc
兩個交叉編譯器分別適用于 armel 和 armhf 兩個不同的架構,armel 和 armhf 這兩種架構在對待浮點運算采取了不同的策略(有 fpu 的 arm 才能支持這兩種浮點運算策略)。
其實這兩個交叉編譯器只不過是 gcc 的選項 -mfloat-abi 的默認值不同。gcc 的選項 -mfloat-abi 有三種值 soft、softfp、hard(其中后兩者都要求 arm 里有 fpu 浮點運算單元,soft 與后兩者是兼容的,但 softfp 和 hard 兩種模式互不兼容):
soft: 不用fpu進行浮點計算,即使有fpu浮點運算單元也不用,而是使用軟件模式。
softfp: armel架構(對應的編譯器為 arm-linux-gnueabi-gcc )采用的默認值,用fpu計算,但是傳參數用普通寄存器傳,這樣中斷的時候,只需要保存普通寄存器,中斷負荷小,但是參數需要轉換成浮點的再計算。
hard: armhf架構(對應的編譯器 arm-linux-gnueabihf-gcc )采用的默認值,用fpu計算,傳參數也用fpu中的浮點寄存器傳,省去了轉換,性能最好,但是中斷負荷高。
把以下測試使用的C文件內容保存成 mfloat.c:
#include
int main(void)
{
double a,b,c;
a = 23.543;
b = 323.234;
c = b/a;
printf(“the 13/2 = %f\n”, c);
printf(“hello world !\n”);
return 0;
}
1、使用 arm-linux-gnueabihf-gcc 編譯,使用“-v”選項以獲取更詳細的信息:
arm-linux-gnueabihf-gcc -v mfloat.c
COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=hard’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’ -mfloat-abi=hard
可看出使用hard硬件浮點模式。
2、使用 arm-linux-gnueabi-gcc 編譯:
arm-linux-gnueabi-gcc -v mfloat.c
COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=softfp’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’ -mfloat-abi=softfp
可看出使用softfp模式。
編輯:hfy
評論
查看更多