加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

Arm64 ?;厮?/h1>

09/08 08:55
1044
閱讀需 5 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

AArch64棧的結(jié)構(gòu)

Arm64有4種棧,分別是空增棧(Empty Ascendant Stack,EA)、空減棧(Empty Descendant Stack,ED)、滿增棧(Full Ascendant Stack,FA)、滿減棧(Full Descendant Stack,FD)。常用的是滿減棧,Linux內(nèi)核也使用滿減棧。

下圖是一個(gè)滿減棧的示意圖,高地址為棧頂,低地址為棧低,棧向低地址方向生長(zhǎng),如右邊的箭頭所示。棧指針SP指向棧底(棧低保存了數(shù)據(jù))。每產(chǎn)生一次函數(shù)調(diào)用,就會(huì)在棧中形成一個(gè)棧幀,該棧總共保存了4個(gè)棧幀(Stack Frame),每個(gè)棧幀由FP、LR及棧參數(shù)(函數(shù)參數(shù)、函數(shù)局部變量等)組成??梢詫V械乃袟暈橐粋€(gè)單項(xiàng)鏈表,棧最低位置的棧幀為鏈表頭,棧最高位置的棧幀為鏈表尾,整個(gè)鏈表使用FP索引。棧手動(dòng)回溯時(shí),可以根據(jù)FP將所有棧幀索引出來。

AArch64過程調(diào)用標(biāo)準(zhǔn)中寄存器的使用規(guī)則

下面是Arm64程序調(diào)用標(biāo)準(zhǔn)規(guī)定的通用寄存器的使用方法。

    • 參數(shù)寄存器(X0-X7)
    • 函數(shù)參數(shù)數(shù)量小于等于8個(gè)時(shí),使用X0-X7傳遞,大于8個(gè)時(shí),多余的使用棧傳遞,函數(shù)返回時(shí)返回值保存在X0中。調(diào)用者保存的臨時(shí)寄存器(X9-X15)
    • 調(diào)用者若使用到了X9-X15寄存器,在調(diào)用子函數(shù)之前,需要將X9-X15寄存器保存到自己的棧中,子函數(shù)使用這些寄存器的時(shí)候不需要保存和恢復(fù)。被調(diào)用者保存的寄存器(X19-X29)
    被調(diào)用者若使用到這些寄存器,需要將其保存到自己的棧中,返回時(shí)從棧中恢復(fù)。特殊用途的寄存器

    • X8是間接結(jié)果寄存器。用于傳遞間接結(jié)果的地址位置,例如,函數(shù)返回一個(gè)大結(jié)構(gòu)。X16-X17過程內(nèi)調(diào)用暫存寄存器。。X18平臺(tái)寄存器。X29是棧幀(FP)寄存器。保存了調(diào)用函數(shù)的棧幀地址。X30保存了返回地址(LR)。函數(shù)返回后跳轉(zhuǎn)到該地址處運(yùn)行。

實(shí)例

下圖是內(nèi)核Oops時(shí)打印出的信息。第一張圖片是寄存器信息,pc寄存器和sp寄存器對(duì)棧回溯有重要作用。第二張圖是內(nèi)核線程irq/231-dwc3棧數(shù)據(jù)的二進(jìn)制轉(zhuǎn)儲(chǔ),?;厮菥褪窃谶@些二進(jìn)制數(shù)據(jù)中找到棧幀,從而找到調(diào)用的函數(shù)地址。

下圖是內(nèi)核?;厮莸慕Y(jié)果,發(fā)生異常函數(shù)的地址保存在異常棧中,不在內(nèi)核線程irq/231-dwc3棧中。

發(fā)生異常的函數(shù)可以根據(jù)pc寄存器得到,該函數(shù)是?;厮莸牡谝粋€(gè)函數(shù)。sp寄存器指向了第一個(gè)棧幀中的FP1寄存器,即0xffffffc0ee823b80地址,F(xiàn)P1向高地址偏移8字節(jié)得到LR1寄存器,即0xffffff80087369e4地址,該地址位于dwc3_ep0_stall_and_restart函數(shù)內(nèi),該函數(shù)是?;厮莸牡诙€(gè)函數(shù)。FP1指向了第二個(gè)棧幀的FP2,根據(jù)棧幀找到LR2,依次類推。所有的棧幀最終如下圖所示,總共找到7個(gè)棧幀,因此irq/231-dwc3內(nèi)核線程發(fā)生異常時(shí)總共有8個(gè)函數(shù)調(diào)用,和內(nèi)核輸出的函數(shù)調(diào)用關(guān)系一致。需要注意的是,代碼里調(diào)用了該函數(shù),但在?;厮葜袥]有找到符號(hào),肯定是編譯器優(yōu)化,將該函數(shù)內(nèi)聯(lián)了,是否內(nèi)聯(lián)可以通過反匯編確認(rèn)。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
FM25CL64B-G 1 Ramtron International Corporation Memory Circuit, 8KX8, CMOS, PDSO8, GREEN, MS-012AA, SOIC-8
$6.47 查看
KSZ9031RNXCA-TR 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER, QCC48

ECAD模型

下載ECAD模型
$105.81 查看
FTLF1318P3BTL 1 Finisar Corporation Transceiver, 1270nm Min, 1360nm Max, 1250Mbps(Tx), 1250Mbps(Rx), LC Connector, Surface Mount, ROHS COMPLIANT PACKAGE

ECAD模型

下載ECAD模型
$278.49 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

針對(duì)嵌入式人工智能,物聯(lián)網(wǎng)等專業(yè)技術(shù)分享和交流平臺(tái),內(nèi)容涉及arm,linux,android等各方面。