ART世界探險(3) - ARM 64位CPU的架構(gòu)快餐教程

ART世界探險(3) - ARM 64位CPU的架構(gòu)快餐教程

前面我們說過虑瀑,Dalvik如果沒有JIT的話般渡,可以做到架構(gòu)無關孩饼,讓Dalvik指令都解釋執(zhí)行。但是ART是AOT微服,要編譯成針對芯片具體的機器指令。
所以缨历,研究Dalvik的時候可以不用太關心目標指令以蕴,而我們研究ART必須對目前最流行的微處理器的架構(gòu)有個基本的了解。
在上一講我們對于ART從java byte code到ARM64 v8指令的整個流程有了一個大概的了解之后戈二,我們就目前最流行的ARM64位芯片的知識進行一些探索舒裤。
我們的目的不是寫一個操作系統(tǒng),所以我們盡可能挑實用的講觉吭。

ARM架構(gòu)簡史

我們用NDK編譯一個jni庫之后會發(fā)現(xiàn)腾供,生成了armeabi,armeabi-v7a,arm64-v8a三個目錄。這三個目錄鲜滩,代表了ARM目前最流行的三種架構(gòu)的指令集伴鳖。

ARM芯片從1985年誕生以來,經(jīng)歷了主要6次大的架構(gòu)調(diào)整徙硅。

  1. ARMv4及之前:只使用32位的ARM指令集榜聂。
  2. ARMv4T,在32位ARM指令集的基礎上嗓蘑,增加了16位的Thumb指令集须肆。這是第一個被廣泛使用的架構(gòu)匿乃,代表芯片ARM7TDMI和ARM9TDMI。
  3. ARMv5TE豌汇,增加了DSP操作幢炸,飽和算法,ARM和Thumb切換拒贱。代表芯片:ARM926EJ-S宛徊。
  4. ARM v6,對內(nèi)存訪問的架構(gòu)有所調(diào)整逻澳,支持SIMD指令闸天。代表芯片:ARM1136JF-S。這一代Thumb2成為可選項斜做。
  5. ARM v7-A苞氮,將v6時可選的Thumb2指令集變成必選項,支持NEON指令瓤逼。代表芯片Cortex-A8, A9, A15, A17葱淳。
  6. ARMv8-A,支持兩種架構(gòu)抛姑,64位的AArch64和AArch32赞厕。其中,AArch32跟原有的v7-A架構(gòu)是基本一樣的定硝。代表芯片為A57, A53, A73, A72.

我們通常見到的armeabi皿桑,實際上對應的是ARM v4T~v6的指令。為了節(jié)省空間蔬啡,我們基本上都編成16位的Thumb指令诲侮。armeabi-v7a,對應v7-A架構(gòu)箱蟆。arm64-v8a對應ARM v8-A的AArch64指令沟绪。

我們習慣上,把ARM v4之前就有的基礎的32位ARM指令集稱為A32指令集空猜,16位的Thumb指令稱為T16指令集绽慈,AArch64指令集稱為A64指令集。

其中辈毯,Thumb/Thumb2和A32指令集是兼容的坝疼。Thumb和Thumb2比較節(jié)省空間,但是有些A32指令的功能是沒有的谆沃。
這時候钝凶,只要從Thumb狀態(tài)切換到ARM狀態(tài)下就好了,執(zhí)行完A32才有的指令唁影,回去再執(zhí)行T16指令就好了耕陷。


arm_1
arm_1

但是A64指令是不兼容Thumb的掂名,在這種狀態(tài)下,只有A64指令這一種指令可以用哟沫。

Android所用的ARM芯片簡史

在Android剛出來的時候铆隘,HTC G1所用的高通MSM7201芯片,基于ARM11,用的是ARM v6指令集南用。
后來德州儀器的OMAP 3430第一次將Cortex-A系列的第一個架構(gòu)Cortex-A8,引入現(xiàn)實世界中掏湾。開啟了ARM v7a的時代裹虫。這個時代的代表機型就是Moto Droid/MileStone,開啟了第一批百萬級的Android手機融击。
隨后筑公,從NVidia的Tegra 2開始,我們進入了A9和雙核的時代尊浪。Tegra 3使用Cortex-A15匣屡,在32位上達到一個高峰。
同時拇涤,以MediaTek為代表的中低端廠商開始將低端的Cortex-A7發(fā)揮到極致捣作,MT6577是兩個A7,MT6589為4個A7鹅士,MT6592是8個A7.
進入64位時代的代表芯片券躁,就是Qualcomm的SnapDragon 810芯片,4個Cortex-A57的發(fā)熱問題困擾了無數(shù)廠商去年整整一年掉盅。
MediaTek繼續(xù)發(fā)揮低端的威力也拜,升級成64位的Cortex-A53。MT6735芯片4個A53趾痘,MT6753芯片8個A53慢哈。幸好最近的Helix X25/20開始用A72+A53了,我們總算是在MTK芯片上見到一次大核的身影永票。

從芯片的廣泛性上考慮卵贱,我們這個講座的目標芯片就放在Cortex-A53上。

Cortex-A57和Cortex-A53芯片對比

我們簡單列一下A57與A53的對比侣集,大家有個直觀印象就好艰赞。

Cortex-A53 Cortex-A57
典型時鐘 2GHz, 28nm工藝 1.5~2.5GHz, 20nm工藝
執(zhí)行順序 順序 亂序、投機問題肚吏、超標量
核心數(shù) 1~4 1~4
峰值整數(shù)能力 2.3MIPS/MHz 4.1~4.76MIPS/MHz
浮點單元
半精度
硬件除法
融合乘法累加
流水線 8級 15級+
返回棧條目 4 8
通用中斷控制 外部 外部
AMBA接口 64位 AMBA 4/5 128位 AMBA 4/5
L1指令緩存 8K ~ 64KB 48KB
L1數(shù)據(jù)緩存 8K ~ 64KB 32KB
L2緩存 可選 集成
L2緩存 128K~2M 512K~2M
主TLB 512 1024
uTLB 10 48指令方妖,32數(shù)據(jù)

對我們理解后續(xù)知識有影響的主要有兩條:一是Cortex-A53不支持亂序執(zhí)行,這將影響未來的優(yōu)化策略罚攀;另一個是A53的流水線沒有A57深党觅,只有8級雌澄。

ARM v8a架構(gòu)簡介

異常等級

ARM v8a引入了異常等級的概念。一共有從EL0到EL3四種異常等級杯瞻,等級越高镐牺,特權(quán)越高。我們的應用一般都運行于EL0魁莉。操作系統(tǒng)內(nèi)核運行于EL1睬涧,EL2和EL3可以留給安全監(jiān)控軟件和KVM之類的虛擬化軟件使用。

AArch64與AArch32

ARM芯片曾經(jīng)指令集比x86容易學的重要原因是歷史包袱少旗唁,不需要兼容歷史上的指令集∑枧ǎ現(xiàn)在ARM 64位芯片也不得不做起兼容自己以前的重任。ARM的做法是將運行狀態(tài)分成AArch64和AArch32兩種狀態(tài)检疫。AArch64就是我們后面重點學習的64位的指令集的運行態(tài)讶请,而AArch32是兼容Arm-v7a的狀態(tài),所有Arm-v7a以及更早的軟件都可以在這個狀態(tài)上正常運行屎媳。
對于我們應用來講夺溢,EL0是沒有權(quán)限進行AArch64和AArch32狀態(tài)切換的,所以我們只能一條道走到黑地用一處狀態(tài)烛谊。這也是我們的A64指令無法切換到A32,T16指令的原因风响。

寄存器

通用寄存器

在AArch64運行態(tài)下,在所有的異常級下丹禀,都可以訪問31個64位通用寄存器钞诡,它們的命名是X0~X30。
這31個64位寄存器也可以通過W0~W30來訪問低32位湃崩。
讀Wn時荧降,不會影響到高32位的值。寫Wn時攒读,會將高32位全部清0.

我們來看一段之前看過的例子:

str x0, [sp, #-32]!
str lr, [sp, #24]
str w1, [sp, #40]
str w2, [sp, #44]

str x0是使用第0個64位寄存器朵诫。
str w1是只使用第1個64位寄存器的低32位

特殊寄存器

  • 零寄存器:XZR/WZR,寫該寄存器會被忽略薄扁,讀該寄存器會得到全0值剪返。
  • PC:程序指針寄存器,64位邓梅。注意脱盲,還是叫PC,不叫XPC叭沼А钱反!在ARMv7之前,PC可以做為R15,當成通用寄存器來使用面哥,在ARMv8上哎壳,不允許直接訪問。
  • SP:棧寄存器尚卫,64位归榕。對應的32位為WSP,但是64位的這個就叫SP不叫XSP爸ㄉ妗刹泄!SP是每個EL對應一個(反正咱們只有EL0這個)。
  • ELR(Exception Link Register):異常鏈接寄存器怎爵,EL1~EL3各有一個特石。存儲了從中斷返回的地址,這個咱們應用沒權(quán)限用疙咸,本系列中學不到
  • SPSR:(Saved Processor State):EL1~EL3各有一個。保存了發(fā)生異常時的狀態(tài)信息风科,這個咱們也用不著撒轮。

狀態(tài)域

在AArch64運行態(tài)下,沒有對應CPSR(Current Program Status Register)的寄存器贼穆。每種狀態(tài)現(xiàn)在需要分別訪問题山。

這些狀態(tài)有:

  • N – 負數(shù)
  • Z – 0
  • C – 進位
  • V – 溢出
  • D – 調(diào)試位
  • A – Serror
  • I – IRQ
  • F – FIQ
  • SS – 軟件單步跟蹤
  • IL – 無效運行態(tài)
  • EL – Exception Level
  • nRW – 執(zhí)行態(tài),0為64位故痊,1為32位
  • SP – 棧指針選擇顶瞳,0為EL0,n為ELn愕秫。

N, Z, C, V四種狀態(tài)是可以在EL0級別被訪問的慨菱,其它的都需要EL1以上級別。所以戴甩,咱們寫應用只需要知道前4個就行了符喝,多省心:)

系統(tǒng)寄存器

系統(tǒng)配置是通過MRS和MSR指令去訪問系統(tǒng)寄存器來實現(xiàn)的。

NEON寄存器

在通用寄存器之外甜孤,ARMv8還提供了32個128位NEON浮點寄存器协饲,V0~V31。它們也可以被當作半精度寄存器H<n>缴川,單精度寄存器S<n>和雙精度寄存器D<n>茉稠。

A64 ATPCS支持最多傳8個參數(shù),通過X0X7把夸。而A32和T32只支持4個而线。說人話就是,如果一個函數(shù)調(diào)用要傳8個參數(shù),就可以放到X0X7這8個64位寄存器里吞获。

ARM v8a小結(jié)

ARM v8a支持AArch64和AArch32兩種運行態(tài)况凉,在應用運行的EL0權(quán)限下不能切換,只能選一種各拷。AArch64狀態(tài)下只能運行A64這一種指令集刁绒,而AArch32運行態(tài)下,可以執(zhí)行A32和Thumb2兩種指令集烤黍,這兩種之間可以自由切換知市。

在AArch64運行態(tài)下,我們有31個64位通用寄存器(X0~X30),32個128位NEON浮點寄存器速蕊,一個零寄存器用于寫無用數(shù)據(jù)嫂丙,一個PC指令指針,一個SP棧指針规哲,狀態(tài)位只需要記4個:N負Z零C進行V溢出跟啤。

既然是快餐文,就講這么多唉锌。大家能對上面小結(jié)的了解清楚隅肥,我們就可以正式向指令集前進了?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市袄简,隨后出現(xiàn)的幾起案子腥放,更是在濱河造成了極大的恐慌,老刑警劉巖绿语,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秃症,死亡現(xiàn)場離奇詭異,居然都是意外死亡吕粹,警方通過查閱死者的電腦和手機种柑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匹耕,“玉大人莹规,你說我怎么就攤上這事∶谏瘢” “怎么了良漱?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長欢际。 經(jīng)常有香客問我母市,道長,這世上最難降的妖魔是什么损趋? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任患久,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒋失。我一直安慰自己返帕,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布篙挽。 她就那樣靜靜地躺著荆萤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铣卡。 梳的紋絲不亂的頭發(fā)上链韭,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音煮落,去河邊找鬼敞峭。 笑死,一個胖子當著我的面吹牛蝉仇,可吹牛的內(nèi)容都是我干的旋讹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼轿衔,長吁一口氣:“原來是場噩夢啊……” “哼沉迹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呀枢,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤胚股,失蹤者是張志新(化名)和其女友劉穎笼痛,沒想到半個月后裙秋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡缨伊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年摘刑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刻坊。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡枷恕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谭胚,到底是詐尸還是另有隱情徐块,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布灾而,位于F島的核電站胡控,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏旁趟。R本人自食惡果不足惜昼激,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧橙困,春花似錦瞧掺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至像捶,卻和暖如春上陕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拓春。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工释簿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硼莽。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓庶溶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親懂鸵。 傳聞我的和親對象是個殘疾皇子偏螺,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 剛?cè)胧至薙ONY Xperia Z5 Premium,其CPU采用了爭(fa)議(re)較大的驍龍(Snapdra...
    別著急我來了閱讀 6,038評論 1 16
  • 過年除了吃喝玩樂睡大覺看大片,最重要的是想明白以下四點终息。 大年初二夺巩,暖陽高照的明媚天,正是穿街串巷地走親訪友的好時...
    沈萬九閱讀 14,879評論 84 376
  • failure n.失敗周崭,失敗者柳譬,不及格,失靈续镇,疏忽美澳,未能 ?swell vi.膨脹,腫脹摸航,隆起vt.使...
    kisslight閱讀 141評論 0 0
  • 那年制跟,她十六歲,第一次喜歡上一個男生酱虎。他不算很高雨膨,斯斯文文的,但很喜歡 踢足球逢净,有著一把低沉的好嗓音哥放,成績很好歼指,常...
    北巷爺閱讀 1,062評論 0 0
  • 雨、夜 是適合想念的 想念 不久的日子 即將謀面相處的小家伙 是歡喜還是難淘 未來突然的增添一小娃 是猝不及防還是...
    墨泉閣主閱讀 316評論 0 3