五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一文解析Arm64 ?;厮?/h1>

2023-07-11 15:48 作者:補給站Linux內(nèi)核  | 我要投稿

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)核也使用滿減棧。

下圖是一個滿減棧的示意圖,高地址為棧頂,低地址為棧低,棧向低地址方向生長,如右邊的箭頭所示。棧指針SP指向棧底(棧低保存了數(shù)據(jù))。每產(chǎn)生一次函數(shù)調(diào)用,就會在棧中形成一個棧幀,該??偣脖4媪?個棧幀(Stack Frame),每個棧幀由FP、LR及棧參數(shù)(函數(shù)參數(shù)、函數(shù)局部變量等)組成。可以將棧中的所有棧幀視為一個單項鏈表,棧最低位置的棧幀為鏈表頭,棧最高位置的棧幀為鏈表尾,整個鏈表使用FP索引。棧手動回溯時,可以根據(jù)FP將所有棧幀索引出來。

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

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

  • 參數(shù)寄存器(X0-X7) 函數(shù)參數(shù)數(shù)量小于等于8個時,使用X0-X7傳遞,大于8個時,多余的使用棧傳遞,函數(shù)返回時返回值保存在X0中。

  • 調(diào)用者保存的臨時寄存器(X9-X15) 調(diào)用者若使用到了X9-X15寄存器,在調(diào)用子函數(shù)之前,需要將X9-X15寄存器保存到自己的棧中,子函數(shù)使用這些寄存器的時候不需要保存和恢復。

  • 被調(diào)用者保存的寄存器(X19-X29) 被調(diào)用者若使用到這些寄存器,需要將其保存到自己的棧中,返回時從棧中恢復。

  • 特殊用途的寄存器

    • X8是間接結(jié)果寄存器。用于傳遞間接結(jié)果的地址位置,例如,函數(shù)返回一個大結(jié)構(gòu)。

    • X16-X17過程內(nèi)調(diào)用暫存寄存器。。

    • X18平臺寄存器。

    • X29是棧幀(FP)寄存器。保存了調(diào)用函數(shù)的棧幀地址。

    • X30保存了返回地址(LR)。函數(shù)返回后跳轉(zhuǎn)到該地址處運行。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ?



實例

下圖是內(nèi)核Oops時打印出的信息。第一張圖片是寄存器信息,pc寄存器和sp寄存器對?;厮萦兄匾饔?。第二張圖是內(nèi)核線程irq/231-dwc3棧數(shù)據(jù)的二進制轉(zhuǎn)儲,棧回溯就是在這些二進制數(shù)據(jù)中找到棧幀,從而找到調(diào)用的函數(shù)地址。

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

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


原文作者:人人極客社區(qū)




贺兰县| 柳江县| 偃师市| 绩溪县| SHOW| 庆城县| 文登市| 卢氏县| 新昌县| 拜城县| 洞口县| 南丰县| 肥西县| 登封市| 敦化市| 铜陵市| 康马县| 黄浦区| 信丰县| 江西省| 西宁市| 慈利县| 阳东县| 新郑市| 名山县| 民权县| 香港 | 浦江县| 达州市| 滁州市| 汪清县| 吉安市| 黑龙江省| 南平市| 遂昌县| 阿拉善左旗| 准格尔旗| 尼玛县| 乐亭县| 新余市| 平陆县|