arm的歷史
ARM的設(shè)計(jì)是艾康計(jì)算機(jī)公司于1983年開始的開發(fā)項(xiàng)目。
這個(gè)團(tuán)隊(duì)由Roger Wilson和Steve Furber帶領(lǐng),著手開發(fā)一種類似高級(jí)6502架構(gòu)的處理器。Acorn計(jì)算機(jī)有一大堆建構(gòu)在6502處理器上的計(jì)算機(jī),因此能設(shè)計(jì)出一顆類似的芯片即意味著對公司有很大的優(yōu)勢。
Acorn RISC Machine:ARM2
用在BBC Micro上的ARM1 second processor
團(tuán)隊(duì)在1985年時(shí)開發(fā)出樣本“ARM1”,而首顆真正能量產(chǎn)的“ARM2”于次年投產(chǎn)。ARM2具有32位的數(shù)據(jù)總線、26位的定址空間,并提供64 Mbyte的定址范圍與16個(gè)32-bit的寄存器。寄存器中有一個(gè)作為程序計(jì)數(shù)器,其前面6位和后面2位用來保存處理器狀態(tài)標(biāo)記。ARM2可能是全世界最簡單實(shí)用的32位微處理器,僅容納了30,000個(gè)晶體管(六年后的摩托羅拉68000包含了70,000顆)。之所以精簡的原因在于它不含微碼(這大概占了68000的晶體管數(shù)約1/4至1/3);而且與當(dāng)時(shí)大多數(shù)的處理器相同,它沒有包含任何的高速緩存。這個(gè)精簡的特色使它只需消耗很少的電能,卻能發(fā)揮比Intel 80286更好的性能[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ì)另組成一間名為安謀國際科技(Advanced RISC Machines Ltd.)的新公司。也基于這原因,使得ARM有時(shí)候反而稱作Advanced RISC Machine而不是Acorn RISC Machine。由于其母公司ARM Holdings plc于1998年在倫敦證券交易所和NASDAQ掛牌上市[11],使得Advanced RISC Machines成了ARM Ltd旗下?lián)碛械?a target="_blank">產(chǎn)品[12]。
這個(gè)項(xiàng)目到后來進(jìn)入“ARM6”,首版的樣品在1991年發(fā)布,然后蘋果計(jì)算機(jī)使用ARM6架構(gòu)的ARM 610來當(dāng)作他們Apple Newton產(chǎn)品的處理器。在1994年,艾康計(jì)算機(jī)使用ARM 610做為他們個(gè)人計(jì)算機(jī)產(chǎn)品的處理器。
在這些變革之后,內(nèi)核部分卻大多維持一樣的大小——ARM2有30,000顆晶體管,但ARM6卻也只增長到35,000顆。主要概念是以O(shè)DM的方式,使ARM核心能搭配一些選配的零件而制成一顆完整的CPU,而且可在現(xiàn)有的晶圓廠里制作并以低成本的方式達(dá)到很大的性能。
ARM的經(jīng)營模式在于出售其IP核,授權(quán)廠家依照設(shè)計(jì)制作出建構(gòu)于此核的微控制器和中央處理器。最成功的實(shí)現(xiàn)案例屬ARM7TDMI,幾乎賣出了數(shù)億套內(nèi)置微控制器的設(shè)備。
Digital曾購買這個(gè)架構(gòu)的產(chǎn)權(quán)并研發(fā)出“StrongARM”。在233 MHz的頻率下,這顆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è)備上[來源請求]。
內(nèi)核種類
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
架構(gòu)
從1995年開始,《ARM體系結(jié)構(gòu)參考手冊》是ARM文檔的主要來源,提供了關(guān)于ARM處理器架構(gòu)和指令集,區(qū)分接口,所有的ARM處理器的支持(如指令語義)的實(shí)現(xiàn)細(xì)節(jié)可能會(huì)有所不同。該體系結(jié)構(gòu)隨著時(shí)間的演變,并與Cortex系列的核心開始,存在三個(gè)“配置”的定義如下:
"應(yīng)用"配置: Cortex-A 系列
"嵌入式"配置: Cortex-R 系列
"微處理器"配置:?ARM Cortex-M?系列。
每個(gè)配置允許有其子集的架構(gòu)。
CPU模式
CPU ARM架構(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)的管理模式。
最新的armv8A arm64 與aarch64
在找交叉編譯鏈過程中被這三個(gè)困惑好久,在選擇之前一定要先搞明白這三者的關(guān)系
ARM在2007年已著手設(shè)計(jì)工作,并于2011年11月公報(bào)ARMv8A 64bit指令集架構(gòu),耗用了4年的研發(fā)時(shí)間。
ARMv8A分為A64及A32兩個(gè)部分,A64顧名思義屬于64bit的部份,主要存在于AARCH64的狀態(tài)。而A32又稱AARCH32狀態(tài),用作支持現(xiàn)有A32 ARM指令集。ARM并沒有采用AMD x86-64及Intel EM64T擴(kuò)充32bit指令做法,而是選擇全新開發(fā)專用的64bit指令。據(jù)ARM方面表示,這一做法與省電的考慮有關(guān),當(dāng)運(yùn)行64bit ISA時(shí),ARMv7電路可處于閑置狀態(tài),節(jié)省功耗。同A64 ISA也移除了作用不大的LDM/STM(load/store multiple)指令,改為LD/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將arm CPU的性能推上了一個(gè)新高度。Cortex-A76還是armv8.2-a構(gòu)架實(shí)現(xiàn),與現(xiàn)有的處理兼容,還是使用DSU技術(shù),到時(shí)微構(gòu)架的重新設(shè)計(jì)使得它比Cortex-A75平均有35%的性能提升,且有40%的能耗比提升。對浮點(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非常有可能完全只支持64 bit,這取決于arm生態(tài)系統(tǒng)的發(fā)展。
arm授權(quán)方式
ARM公司本身并不靠自有的設(shè)計(jì)來制造或出售CPU,而是將處理器架構(gòu)授權(quán)給有興趣的廠家。ARM提供了多樣的授權(quán)條款,包括售價(jià)與散播性等項(xiàng)目。對于授權(quán)方來說,ARM提供了ARM內(nèi)核的集成硬件敘述,包含完整的軟件開發(fā)工具(編譯器、debugger、SDK),以及針對內(nèi)含ARM CPU硅芯片的銷售權(quán)。對于無晶圓廠的授權(quán)方來說,其希望能將ARM內(nèi)核集成到他們自行研發(fā)的芯片設(shè)計(jì)中,通常就僅針對獲取一份生產(chǎn)就緒的智財(cái)核心技術(shù)(IP Core)認(rèn)證。
許多半導(dǎo)體公司持有ARM授權(quán):Atmel、Broadcom、Cirrus Logic、Freescale(于2004從摩托羅拉公司獨(dú)立出來)、富士通、英特爾(借由和Digital的控訴調(diào)停)、IBM、NVIDIA、臺(tái)灣新唐科技(Nuvoton Technology)、英飛凌、任天堂、恩智浦半導(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收購)基于GCC推出的的ARM交叉編譯工具。可用于交叉編譯ARM(32位)系統(tǒng)中所有環(huán)節(jié)的代碼,包括裸機(jī)程序、u-boot、Linux kernel、filesystem和App應(yīng)用程序。
arm-linux-gnueabihf-gcc:是由 Linaro 公司基于GCC推出的的ARM交叉編譯工具??捎糜诮徊婢幾gARM(32位)系統(tǒng)中所有環(huán)節(jié)的代碼,包括裸機(jī)程序、u-boot、Linux kernel、filesystem和App應(yīng)用程序。
aarch64-linux-gnu-gcc:是由 Linaro 公司基于GCC推出的的ARM交叉編譯工具。可用于交叉編譯ARMv8 64位目標(biāo)中的裸機(jī)程序、u-boot、Linux kernel、filesystem和App應(yīng)用程序。
arm-none-elf-gcc:是 Codesourcery 公司(目前已經(jīng)被Mentor收購)基于GCC推出的的ARM交叉編譯工具??捎糜诮徊婢幾gARM MCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。
arm-none-eabi-gcc:是 GNU 推出的的ARM交叉編譯工具??捎糜诮徊婢幾gARM MCU(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)制接口(Embedded Application Binary Interface)
根據(jù)對操作系統(tǒng)的支持與否,ARM GCC可分為支持和不支持操作系統(tǒng),如
arm-none-eabi:這個(gè)是沒有操作系統(tǒng)的,自然不可能支持那些跟操作系統(tǒng)關(guān)系密切的函數(shù),比如fork(2)。他使用的是newlib這個(gè)專用于嵌入式系統(tǒng)的C庫。
arm-none-linux-eabi:用于Linux的,使用Glibc
linaro交叉編譯鏈簡介
以下面的鏈接為例,分析下各個(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-2018 00: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-2018 00: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-2018 00: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-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
這個(gè)runtime以及sysroot-glibc暫時(shí)不確定是做什么用的。
再補(bǔ)充點(diǎn)交叉編譯鏈的東西:
實(shí)例
1、arm-none-eabi-gcc
(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)
用于編譯 ARM 架構(gòu)的裸機(jī)系統(tǒng)(包括 ARM Linux 的 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庫。
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架構(gòu)的Linux系統(tǒng),可用于編譯 ARM 架構(gòu)的 u-boot、Linux內(nèi)核、linux應(yīng)用等。arm-none-linux-gnueabi基于GCC,使用Glibc庫,經(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
Android ARM 編譯器。
4、armcc
ARM 公司推出的編譯工具,功能和 arm-none-eabi 類似,可以編譯裸機(jī)程序(u-boot、kernel),但是不能編譯 Linux 應(yīng)用程序。armcc一般和ARM開發(fā)工具一起,Keil MDK、ADS、RVDS和DS-5中的編譯器都是armcc,所以 armcc 編譯器都是收費(fèi)的(愛國版除外,呵呵~~)。
5、arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc
arm-none-uclinuxeabi 用于uCLinux,使用Glibc。
arm-none-symbianelf 用于symbian,沒用過,不知道C庫是什么 。
Codesourcery
Codesourcery推出的產(chǎn)品叫Sourcery G++ Lite Edition,其中基于command-line的編譯器是免費(fèi)的,在官網(wǎng)上可以下載,而其中包含的IDE和debug 工具是收費(fèi)的,當(dāng)然也有30天試用版本的。
目前CodeSourcery已經(jīng)由明導(dǎo)國際(Mentor Graphics)收購,所以原本的網(wǎng)站風(fēng)格已經(jīng)全部變?yōu)?Mentor 樣式,但是 Sourcery G++ Lite Edition 同樣可以注冊后免費(fèi)下載。
Codesourcery一直是在做ARM目標(biāo) GCC 的開發(fā)和優(yōu)化,它的ARM GCC在目前在市場上非常優(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)建的即可,如果你對交叉編譯器感興趣的話。
ABI 和 EABI
ABI:二進(jìn)制應(yīng)用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在計(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ā)者使用自己的匯編語言也可以使用 EABI 作為與兼容的編譯器生成的匯編語言的接口。
兩者主要區(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)在對待浮點(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)(對應(yīng)的編譯器為 arm-linux-gnueabi-gcc )采用的默認(rèn)值,用fpu計(jì)算,但是傳參數(shù)用普通寄存器傳,這樣中斷的時(shí)候,只需要保存普通寄存器,中斷負(fù)荷小,但是參數(shù)需要轉(zhuǎn)換成浮點(diǎn)的再計(jì)算。
hard: armhf架構(gòu)(對應(yīng)的編譯器 arm-linux-gnueabihf-gcc )采用的默認(rèn)值,用fpu計(jì)算,傳參數(shù)也用fpu中的浮點(diǎn)寄存器傳,省去了轉(zhuǎn)換,性能最好,但是中斷負(fù)荷高。
把以下測試使用的C文件內(nèi)容保存成 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”選項(xiàng)以獲取更詳細(xì)的信息:
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硬件浮點(diǎn)模式。
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
評論
查看更多