下面是Arm64程序調用標準規(guī)定的通用寄存器的使用方法。
參數寄存器(X0-X7) 函數參數數量小于等于8個時,使用X0-X7傳遞,大于8個時,多余的使用棧傳遞,函數返回時返回值保存在X0中。
調用者保存的臨時寄存器(X9-X15)調用者若使用到了X9-X15寄存器,在調用子函數之前,需要將X9-X15寄存器保存到自己的棧中,子函數使用這些寄存器的時候不需要保存和恢復。
被調用者保存的寄存器(X19-X29) 被調用者若使用到這些寄存器,需要將其保存到自己的棧中,返回時從棧中恢復。
特殊用途的寄存器
X8是間接結果寄存器。用于傳遞間接結果的地址位置,例如,函數返回一個大結構。
X16-X17過程內調用暫存寄存器。。
X18平臺寄存器。
X29是棧幀(FP)寄存器。保存了調用函數的棧幀地址。
X30保存了返回地址(LR)。函數返回后跳轉到該地址處運行。
實例下圖是內核Oops時打印出的信息。第一張圖片是寄存器信息,pc寄存器和sp寄存器對棧回溯有重要作用。第二張圖是內核線程irq/231-dwc3棧數據的二進制轉儲,?;厮菥褪窃谶@些二進制數據中找到棧幀,從而找到調用的函數地址。
下圖是內核?;厮莸慕Y果,發(fā)生異常函數的地址保存在異常棧中,不在內核線程irq/231-dwc3棧中。
發(fā)生異常的函數可以根據pc寄存器得到,該函數是?;厮莸牡谝粋€函數。sp寄存器指向了第一個棧幀中的FP1寄存器,即0xffffffc0ee823b80地址,F(xiàn)P1向高地址偏移8字節(jié)得到LR1寄存器,即0xffffff80087369e4地址,該地址位于dwc3_ep0_stall_and_restart函數內,該函數是棧回溯的第二個函數。FP1指向了第二個棧幀的FP2,根據棧幀找到LR2,依次類推。所有的棧幀最終如下圖所示,總共找到7個棧幀,因此irq/231-dwc3內核線程發(fā)生異常時總共有8個函數調用,和內核輸出的函數調用關系一致。需要注意的是,代碼里調用了該函數,但在?;厮葜袥]有找到符號,肯定是編譯器優(yōu)化,將該函數內聯(lián)了,是否內聯(lián)可以通過反匯編確認。
-
Linux
+關注
關注
87文章
11292瀏覽量
209332 -
程序
+關注
關注
117文章
3785瀏覽量
81004
發(fā)布評論請先 登錄
相關推薦
評論