眾所周知ARM的設(shè)計(jì)是艾康計(jì)算機(jī)公司于1983年開始的開發(fā)項(xiàng)目。這個(gè)團(tuán)隊(duì)由RogerWilson和SteveFurber帶領(lǐng),著手開發(fā)一種類似高級(jí)6502架構(gòu)的處理器。Acorn計(jì)算機(jī)有一大堆建構(gòu)在6502處理器上的計(jì)算機(jī),因此能設(shè)計(jì)出一顆類似的芯片即意味著對(duì)公司有很大的優(yōu)勢(shì)。
AcornRISCMachine:ARM2
用在BBCMicro上的ARM1secondprocessor
團(tuán)隊(duì)在1985年時(shí)開發(fā)出樣本“ARM1”,而首顆真正能量產(chǎn)的“ARM2”于次年投產(chǎn)。ARM2具有32位的數(shù)據(jù)總線、26位的定址空間,并提供64Mbyte的定址范圍與16個(gè)32-bit的寄存器。寄存器中有一個(gè)作為程序計(jì)數(shù)器,其前面6位和后面2位用來保存處理器狀態(tài)標(biāo)記。ARM2可能是全世界最簡(jiǎn)單實(shí)用的32位微處理器,僅容納了30,000個(gè)晶體管(六年后的摩托羅拉68000包含了70,000顆)。之所以精簡(jiǎn)的原因在于它不含微碼(這大概占了68000的晶體管數(shù)約1/4至1/3);而且與當(dāng)時(shí)大多數(shù)的處理器相同,它沒有包含任何的高速緩存。這個(gè)精簡(jiǎn)的特色使它只需消耗很少的電能,卻能發(fā)揮比Intel80286更好的性能[10]。后繼的處理器“ARM3”則備有4KB的高速緩存,使它能發(fā)揮更佳的性能。
Apple、DEC、Intel、Marvell:ARM6、StrongARM、XScale[編輯]
在1980年代晚期,蘋果計(jì)算機(jī)開始與艾康計(jì)算機(jī)合作開發(fā)新版的ARM核心。由于這項(xiàng)目非常重要,艾康計(jì)算機(jī)甚至于1990年將設(shè)計(jì)團(tuán)隊(duì)另組成一間名為安謀國(guó)際科技(AdvancedRISCMachinesLtd.)的新公司。也基于這原因,使得ARM有時(shí)候反而稱作AdvancedRISCMachine而不是AcornRISCMachine。由于其母公司ARMHoldingsplc于1998年在倫敦證券交易所和NASDAQ掛牌上市[11],使得AdvancedRISCMachines成了ARMLtd旗下?lián)碛械漠a(chǎn)品[12]。
這個(gè)項(xiàng)目到后來進(jìn)入“ARM6”,首版的樣品在1991年發(fā)布,然后蘋果計(jì)算機(jī)使用ARM6架構(gòu)的ARM610來當(dāng)作他們AppleNewton產(chǎn)品的處理器。在1994年,艾康計(jì)算機(jī)使用ARM610做為他們個(gè)人計(jì)算機(jī)產(chǎn)品的處理器。
在這些變革之后,內(nèi)核部分卻大多維持一樣的大小——ARM2有30,000顆晶體管,但ARM6卻也只增長(zhǎng)到35,000顆。主要概念是以O(shè)DM的方式,使ARM核心能搭配一些選配的零件而制成一顆完整的CPU,而且可在現(xiàn)有的晶圓廠里制作并以低成本的方式達(dá)到很大的性能。
ARM的經(jīng)營(yíng)模式在于出售其IP核,授權(quán)廠家依照設(shè)計(jì)制作出建構(gòu)于此核的微控制器和中央處理器。最成功的實(shí)現(xiàn)案例屬ARM7TDMI,幾乎賣出了數(shù)億套內(nèi)置微控制器的設(shè)備。
Digital曾購(gòu)買這個(gè)架構(gòu)的產(chǎn)權(quán)并研發(fā)出“StrongARM”。在233MHz的頻率下,這顆CPU只消耗1瓦特的電能(后來的芯片消耗得更少)。這項(xiàng)設(shè)計(jì)后來為了和英特爾的控訴和解而技術(shù)移轉(zhuǎn),英特爾因而利用StrongARM架構(gòu)補(bǔ)強(qiáng)他們老舊的i960產(chǎn)品。英特爾后來開發(fā)出他們自有的高性能架構(gòu)產(chǎn)品XScale,之后賣給了邁威爾科技。
支持智能手機(jī)、個(gè)人數(shù)碼助理和其他手持設(shè)備最常見的架構(gòu)是“ARMv4”。XScale和ARM926處理器是“ARMv5TE”,而且比起建構(gòu)在ARMv4的StrongARM、ARM925T和ARM7TDMI等處理器還更常見于許多高端設(shè)備上[來源請(qǐng)求]。
內(nèi)核種類
ARMv1ARM1
ARMv2ARM2、ARM3
ARMv3ARM6、ARM7
ARMv4StrongARM、ARM7TDMI、ARM9TDMI
ARMv5ARM7EJ、ARM9E、ARM10E、XScale
ARMv6ARM11、ARMCortex-M
ARMv7ARMCortex-A、ARMCortex-M、ARMCortex-R
ARMv8(A)Cortex-A35、Cortex-A50系列[13]、Cortex-A72、Cortex-A73、Cortex-A75、Cortex-A76
架構(gòu)
從1995年開始,《ARM體系結(jié)構(gòu)參考手冊(cè)》是ARM文檔的主要來源,提供了關(guān)于ARM處理器架構(gòu)和指令集,區(qū)分接口,所有的ARM處理器的支持(如指令語(yǔ)義)的實(shí)現(xiàn)細(xì)節(jié)可能會(huì)有所不同。該體系結(jié)構(gòu)隨著時(shí)間的演變,并與Cortex系列的核心開始,存在三個(gè)“配置”的定義如下:
"應(yīng)用"配置:Cortex-A系列
"嵌入式"配置:Cortex-R系列
"微處理器"配置:ARMCortex-M系列。
每個(gè)配置允許有其子集的架構(gòu)。
CPU模式
CPUARM架構(gòu)指定了以下的CPU模式。在任何時(shí)刻,CPU只可處于某一種模式,但可由于外部事件(中斷)或編程方式進(jìn)行模式切換。
用戶模式僅非特權(quán)模式。
系統(tǒng)模式僅無需例外進(jìn)入的特權(quán)模式。僅以執(zhí)行明確寫入CPSR的模式位的指令進(jìn)入。Supervisor(svc)模式在CPU被重置或者SWI指令被執(zhí)行時(shí)進(jìn)入的特權(quán)模式。
Abort模式預(yù)讀取中斷或數(shù)據(jù)中斷異常發(fā)生時(shí)進(jìn)入的特權(quán)模式。
未定義模式未定義指令異常發(fā)生時(shí)進(jìn)入的特權(quán)模式。
干預(yù)模式處理器接受一條IRQ干預(yù)時(shí)進(jìn)入的特權(quán)模式。
快速干預(yù)模式處理器接受一條IRQ干預(yù)時(shí)進(jìn)入的特權(quán)模式。
Hyp模式armv-7a為cortex-A15處理器提供硬件虛擬化引進(jìn)的管理模式。
最新的armv8Aarm64與aarch64
在找交叉編譯鏈過程中被這三個(gè)困惑好久,在選擇之前一定要先搞明白這三者的關(guān)系
ARM在2007年已著手設(shè)計(jì)工作,并于2011年11月公報(bào)ARMv8A64bit指令集架構(gòu),耗用了4年的研發(fā)時(shí)間。
ARMv8A分為A64及A32兩個(gè)部分,A64顧名思義屬于64bit的部份,主要存在于AARCH64的狀態(tài)。而A32又稱AARCH32狀態(tài),用作支持現(xiàn)有A32ARM指令集。ARM并沒有采用AMDx86-64及IntelEM64T擴(kuò)充32bit指令做法,而是選擇全新開發(fā)專用的64bit指令。據(jù)ARM方面表示,這一做法與省電的考慮有關(guān),當(dāng)運(yùn)行64biTISA時(shí),ARMv7電路可處于閑置狀態(tài),節(jié)省功耗。同A64ISA也移除了作用不大的LDM/STM(load/storemulTIple)指令,改為L(zhǎng)D/ST’P’指令,以降低復(fù)雜性及功耗,與此同時(shí),32bit到64bit狀態(tài)轉(zhuǎn)換采用Inter-processing的做法,確保32bit到64bit指令皆可順利執(zhí)行。
armv8A架構(gòu)又細(xì)分為armv8.2a、armv8.3a、armv8.4a、armv8.5a。
在今年的Computex上arm公布了2018年的Cortex-A旗艦CPU,Cortex-A76.這個(gè)CPU的微構(gòu)架做了徹底的重新設(shè)計(jì),它重點(diǎn)提高了峰值性能,同時(shí)良好地保持了性能功耗比。Cortex-A76將armCPU的性能推上了一個(gè)新高度。Cortex-A76還是armv8.2-a構(gòu)架實(shí)現(xiàn),與現(xiàn)有的處理兼容,還是使用DSU技術(shù),到時(shí)微構(gòu)架的重新設(shè)計(jì)使得它比Cortex-A75平均有35%的性能提升,且有40%的能耗比提升。對(duì)浮點(diǎn)數(shù)和機(jī)器學(xué)習(xí)運(yùn)算任務(wù)提升最大。麒麟980用的性能核心就是公版Cortex-A76.
Cortex-A76是第一個(gè)開始逐漸去除32bit支持的CPU。A76還是支持aarch32,但是只是在最低特權(quán)級(jí)的EL0支持,而aarch64在EL0-EL3都支持-從OS到底層的固件。在將來某個(gè)時(shí)候,arm非常有可能完全只支持64bit,這取決于arm生態(tài)系統(tǒng)的發(fā)展。
arm授權(quán)方式
ARM公司本身并不靠自有的設(shè)計(jì)來制造或出售CPU,而是將處理器架構(gòu)授權(quán)給有興趣的廠家。ARM提供了多樣的授權(quán)條款,包括售價(jià)與散播性等項(xiàng)目。對(duì)于授權(quán)方來說,ARM提供了ARM內(nèi)核的集成硬件敘述,包含完整的軟件開發(fā)工具(編譯器、debugger、SDK),以及針對(duì)內(nèi)含ARMCPU硅芯片的銷售權(quán)。對(duì)于無晶圓廠的授權(quán)方來說,其希望能將ARM內(nèi)核集成到他們自行研發(fā)的芯片設(shè)計(jì)中,通常就僅針對(duì)獲取一份生產(chǎn)就緒的智財(cái)核心技術(shù)(IPCore)認(rèn)證。
許多半導(dǎo)體公司持有ARM授權(quán):Atmel、Broadcom、CirrusLogic、Freescale(于2004從摩托羅拉公司獨(dú)立出來)、富士通、英特爾(借由和Digital的控訴調(diào)停)、IBM、NVIDIA、臺(tái)灣新唐科技(NuvotonTechnology)、英飛凌、任天堂、恩智浦半導(dǎo)體(于2006年從飛利浦獨(dú)立出來)、OKI電氣工業(yè)、三星電子、Sharp、STMicroelectronics、德州儀器和VLSI等許多這些公司均擁有各個(gè)不同形式的ARM授權(quán)。雖然ARM的授權(quán)項(xiàng)目由保密合約所涵蓋,在知識(shí)產(chǎn)權(quán)工業(yè),ARM是廣為人知最昂貴的CPU內(nèi)核之一。單一的客戶產(chǎn)品包含一個(gè)基本的ARM內(nèi)核可能就需索取一次高達(dá)美金20萬的授權(quán)費(fèi)用。而若是牽涉到大量架構(gòu)上修改,則費(fèi)用就可能超過千萬美元。
交叉編譯鏈選擇
以上都是廢話,重點(diǎn)關(guān)注armv8a即可。armv8a分為aarch32與aarch64兩種模式。因此在選擇交叉編譯鏈時(shí)一定要確定自己運(yùn)行的arm設(shè)備是什么架構(gòu),什么模式。
從授權(quán)上,交叉編譯鏈分為免費(fèi)授權(quán)版和付費(fèi)授權(quán)版。
免費(fèi)版目前有三大主流工具商提供,第一是GNU(提供源碼,自行編譯制作),第二是Codesourcery,第三是Linora。
收費(fèi)版有ARM原廠提供的armcc、IAR提供的編譯器等等,因?yàn)檫@些價(jià)格都比較昂貴,不適合學(xué)習(xí)用戶使用,所以不做講述。
arm-none-linux-gnueabi-gcc:是Codesourcery公司(目前已經(jīng)被Mentor收購(gòu))基于GCC推出的的ARM交叉編譯工具??捎糜诮徊婢幾gARM(32位)系統(tǒng)中所有環(huán)節(jié)的代碼,包括裸機(jī)程序、u-boot、Linuxkernel、filesystem和App應(yīng)用程序。
arm-linux-gnueabihf-gcc:是由Linaro公司基于GCC推出的的ARM交叉編譯工具??捎糜诮徊婢幾gARM(32位)系統(tǒng)中所有環(huán)節(jié)的代碼,包括裸機(jī)程序、u-boot、Linuxkernel、filesystem和App應(yīng)用程序。
aarch64-linux-gnu-gcc:是由Linaro公司基于GCC推出的的ARM交叉編譯工具??捎糜诮徊婢幾gARMv864位目標(biāo)中的裸機(jī)程序、u-boot、Linuxkernel、filesystem和App應(yīng)用程序。
arm-none-elf-gcc:是Codesourcery公司(目前已經(jīng)被Mentor收購(gòu))基于GCC推出的的ARM交叉編譯工具??捎糜诮徊婢幾gARMMCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。
arm-none-eabi-gcc:是GNU推出的的ARM交叉編譯工具??捎糜诮徊婢幾gARMMCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。
命名規(guī)則
交叉編譯工具鏈的命名規(guī)則為:arch[-vendor][-os][-(gnu)eabi]
arch–體系架構(gòu),如ARM,MIPS(通過交叉編譯工具生成的可執(zhí)行文件或系統(tǒng)鏡像的運(yùn)行平臺(tái)或環(huán)境)
vendor–工具鏈提供商
os–目標(biāo)操作系統(tǒng)(host主要操作平臺(tái),也就是編譯時(shí)的系統(tǒng))
eabi–嵌入式應(yīng)用二進(jìn)制接口(EmbeddedApplicaTIonBinaryInterface)
根據(jù)對(duì)操作系統(tǒng)的支持與否,ARMGCC可分為支持和不支持操作系統(tǒng),如
arm-none-eabi:這個(gè)是沒有操作系統(tǒng)的,自然不可能支持那些跟操作系統(tǒng)關(guān)系密切的函數(shù),比如fork(2)。他使用的是newlib這個(gè)專用于嵌入式系統(tǒng)的C庫(kù)。
arm-none-linux-eabi:用于Linux的,使用Glibc
linaro交叉編譯鏈簡(jiǎn)介
以下面的鏈接為例,分析下各個(gè)文件的作用。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-201800:17234.0Mopen
運(yùn)行在32位x86windows主機(jī)的aarch64支持linux系統(tǒng)的交叉編譯鏈。
gcc-linaro-5.5.0-2017.10-i686_aarch64-linux-gnu.tar.xz27-Feb-201800:1789.0Mopen
運(yùn)行在32位x86linux主機(jī)的aarch64位支持linux系統(tǒng)的交叉編譯鏈。
gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz27-Feb-201800:1789.9Mopen
運(yùn)行在64位linux主機(jī)的aarch64位支持linux系統(tǒng)的交叉編譯鏈。這個(gè)正是我要找的交叉編譯鏈。
runTIme-gcc-linaro-5.5.0-2017.10-aarch64-linux-gnu.tar.xz28-Jan-201817:326.2Mopen
runtime-gcc-linaro-5.5.0-2017.10-aarch64-linux-gnu.tar.xz.asc28-Jan-201817:3292open
sysroot-glibc-linaro-2.21-2017.10-aarch64-linux-gnu.tar.xz27-Feb-201800:1833.6Mopen
sysroot-glibc-linaro-2.21-2017.10-aarch64-linux-gnu.tar.xz.asc
這個(gè)runtime以及sysroot-glibc暫時(shí)不確定是做什么用的。
再補(bǔ)充點(diǎn)交叉編譯鏈的東西:
實(shí)例
1、arm-none-eabi-gcc
(ARMarchitecture,novendor,nottargetanoperatingsystem,complieswiththeARMEABI)
用于編譯ARM架構(gòu)的裸機(jī)系統(tǒng)(包括ARMLinux的boot、kernel,不適用編譯Linux應(yīng)用Application),一般適合ARM7、Cortex-M和Cortex-R內(nèi)核的芯片使用,所以不支持那些跟操作系統(tǒng)關(guān)系密切的函數(shù),比如fork(2),他使用的是newlib這個(gè)專用于嵌入式系統(tǒng)的C庫(kù)。
2、arm-none-linux-gnueabi-gcc
(ARMarchitecture,novendor,createsbinariesthatrunontheLinuxoperatingsystem,andusestheGNUEABI)
主要用于基于ARM架構(gòu)的Linux系統(tǒng),可用于編譯ARM架構(gòu)的u-boot、Linux內(nèi)核、linux應(yīng)用等。arm-none-linux-gnueabi基于GCC,使用Glibc庫(kù),經(jīng)過Codesourcery公司優(yōu)化過推出的編譯器。arm-none-linux-gnueabi-xxx交叉編譯工具的浮點(diǎn)運(yùn)算非常優(yōu)秀。一般ARM9、ARM11、Cortex-A內(nèi)核,帶有Linux操作系統(tǒng)的會(huì)用到。
3、arm-eabi-gcc
AndroidARM編譯器。
4、armcc
ARM公司推出的編譯工具,功能和arm-none-eabi類似,可以編譯裸機(jī)程序(u-boot、kernel),但是不能編譯Linux應(yīng)用程序。armcc一般和ARM開發(fā)工具一起,KeilMDK、ADS、RVDS和DS-5中的編譯器都是armcc,所以armcc編譯器都是收費(fèi)的(愛國(guó)版除外,呵呵~~)。
5、arm-none-uclinuxeabi-gcc和arm-none-symbianelf-gcc
arm-none-uclinuxeabi用于uCLinux,使用Glibc。
arm-none-symbianelf用于symbian,沒用過,不知道C庫(kù)是什么。
Codesourcery
Codesourcery推出的產(chǎn)品叫SourceryG++LiteEdition,其中基于command-line的編譯器是免費(fèi)的,在官網(wǎng)上可以下載,而其中包含的IDE和debug工具是收費(fèi)的,當(dāng)然也有30天試用版本的。
目前CodeSourcery已經(jīng)由明導(dǎo)國(guó)際(MentorGraphics)收購(gòu),所以原本的網(wǎng)站風(fēng)格已經(jīng)全部變?yōu)镸entor樣式,但是SourceryG++LiteEdition同樣可以注冊(cè)后免費(fèi)下載。
Codesourcery一直是在做ARM目標(biāo)GCC的開發(fā)和優(yōu)化,它的ARMGCC在目前在市場(chǎng)上非常優(yōu)秀,很多patch可能還沒被gcc接受,所以還是應(yīng)該直接用它的(而且他提供Windows下[mingw交叉編譯的]和Linux下的二進(jìn)制版本,比較方便;如果不是很有時(shí)間和興趣,不建議下載src源碼包自己編譯,很麻煩,Codesourcery給的shell腳本很多時(shí)候根本沒辦法直接用,得自行提取關(guān)鍵的部分手工執(zhí)行,又費(fèi)精力又費(fèi)時(shí)間,如果想知道細(xì)節(jié),其實(shí)不用自己編譯一遍,看看他是用什么步驟構(gòu)建的即可,如果你對(duì)交叉編譯器感興趣的話。
ABI和EABI
ABI:二進(jìn)制應(yīng)用程序接口(ApplicationBinaryInterface(ABI)fortheARMArchitecture)。在計(jì)算機(jī)中,應(yīng)用二進(jìn)制接口描述了應(yīng)用程序(或者其他類型)和操作系統(tǒng)之間或其他應(yīng)用程序的低級(jí)接口。
EABI:嵌入式ABI。嵌入式應(yīng)用二進(jìn)制接口指定了文件格式、數(shù)據(jù)類型、寄存器使用、堆積組織優(yōu)化和在一個(gè)嵌入式軟件中的參數(shù)的標(biāo)準(zhǔn)約定。開發(fā)者使用自己的匯編語(yǔ)言也可以使用EABI作為與兼容的編譯器生成的匯編語(yǔ)言的接口。
兩者主要區(qū)別是,ABI是計(jì)算機(jī)上的,EABI是嵌入式平臺(tái)上(如ARM,MIPS等)。
arm-linux-gnueabi-gcc和arm-linux-gnueabihf-gcc
兩個(gè)交叉編譯器分別適用于armel和armhf兩個(gè)不同的架構(gòu),armel和armhf這兩種架構(gòu)在對(duì)待浮點(diǎn)運(yùn)算采取了不同的策略(有fpu的arm才能支持這兩種浮點(diǎn)運(yùn)算策略)。
其實(shí)這兩個(gè)交叉編譯器只不過是gcc的選項(xiàng)-mfloat-abi的默認(rèn)值不同。gcc的選項(xiàng)-mfloat-abi有三種值soft、softfp、hard(其中后兩者都要求arm里有fpu浮點(diǎn)運(yùn)算單元,soft與后兩者是兼容的,但softfp和hard兩種模式互不兼容):
soft:不用fpu進(jìn)行浮點(diǎn)計(jì)算,即使有fpu浮點(diǎn)運(yùn)算單元也不用,而是使用軟件模式。
softfp:armel架構(gòu)(對(duì)應(yīng)的編譯器為arm-linux-gnueabi-gcc)采用的默認(rèn)值,用fpu計(jì)算,但是傳參數(shù)用普通寄存器傳,這樣中斷的時(shí)候,只需要保存普通寄存器,中斷負(fù)荷小,但是參數(shù)需要轉(zhuǎn)換成浮點(diǎn)的再計(jì)算。
hard:armhf架構(gòu)(對(duì)應(yīng)的編譯器arm-linux-gnueabihf-gcc)采用的默認(rèn)值,用fpu計(jì)算,傳參數(shù)也用fpu中的浮點(diǎn)寄存器傳,省去了轉(zhuǎn)換,性能最好,但是中斷負(fù)荷高。
把以下測(cè)試使用的C文件內(nèi)容保存成mfloat.c:
#include
intmain(void)
{
doublea,b,c;
a=23.543;
b=323.234;
c=b/a;
printf(“the13/2=%f\n”,c);
printf(“helloworld!\n”);
return0;
}
1、使用arm-linux-gnueabihf-gcc編譯,使用“-v”選項(xiàng)以獲取更詳細(xì)的信息:
arm-linux-gnueabihf-gcc-vmfloat.c
COLLECT_GCC_OPTIONS=’-v’‘-march=armv7-a’‘-mfloat-abi=hard’‘-mfpu=vfpv3-d16′‘-mthumb’-mfloat-abi=hard
可看出使用hard硬件浮點(diǎn)模式。
2、使用arm-linux-gnueabi-gcc編譯:
arm-linux-gnueabi-gcc-vmfloat.c
COLLECT_GCC_OPTIONS=’-v’‘-march=armv7-a’‘-mfloat-abi=softfp’‘-mfpu=vfpv3-d16′‘-mthumb’-mfloat-abi=softfp
可看出使用softfp模式。