加入星計(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è)圖譜

不再懼怕Linux內(nèi)核panic (一)

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

前言

曾經(jīng)我看到Linux kernel panic,我也會(huì)很panic,感覺無從下手,但經(jīng)過不斷學(xué)習(xí)和摸索積累后,目前的我已經(jīng)不再panic了,其實(shí)內(nèi)核panic后打印的信息通常都會(huì)包含一系列關(guān)鍵信息,會(huì)幫助我們進(jìn)一步分析診斷導(dǎo)致系統(tǒng)崩潰的根本原因。

今天就先認(rèn)識(shí)一下panic信息。

以下是一個(gè)ARM64架構(gòu)Linux kernel panic打印信息示例:

Kernel panic - not syncing: Fatal exception in interrupt handler
CPU: 0 PID: 250 Comm: irq/10000000-mmc0 Not tainted 5.?.0-rc1 #1
Hardware name: Generic AArch64 (DT)
pstate: 80000005 (Nzcv daif -PAN -UAO)
pc : 0000000000000000 lr : 0000000000000000
sp : ffff800000093e20 x29: ffff800000093e00
x28: 0000000000000000 x27: 0000000000000000
x26: 0000000000000000 x25: 0000000000000000
x24: 0000000000000000 x23: 0000000000000000
x22: 0000000000000000 x21: 0000000000000000
x20: 0000000000000000 x19: 0000000000000000
x18: 0000000000000000 x17: 0000000000000000
x16: 0000000000000000 x15: 0000000000000000
x14: 0000000000000000 x13: 0000000000000000
x12: 0000000000000000 x11: 0000000000000000
x10: 0000000000000000 x9 : 0000000000000000
x8 : 0000000000000000 x7 : 0000000000000000
x6 : 0000000000000000 x5 : 0000000000000000
x4 : 0000000000000000 x3 : 0000000000000000
x2 : 0000000000000000 x1 : 0000000000000000
x0 : 0000000000000000 Call trace:
show_stack+0x14/0x20
dump_stack_lvl+0x40/0x58
dump_stack+0x.png
panic+0x17c/0x328
do_exit+0x2b8/0x45c
do_group_exit+0x3a/0xa0
SyS_exit_group+0x14/0x20
el0_svc_naked+0x28/0x2c
Modules linked in: [list of loaded modules]
---[ end trace 123456789abcdef0 ]---

Kernel panic - not syncing: Fatal exception in interrupt handler
Kernel Offset: 0x0000000000000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
---[ end Kernel panic - not syncing: Fatal exception in interrupt handler ]---

針對(duì)以上示例信息說明如下:

標(biāo)題與原因

Kernel panic - not syncing: Fatal exception in interrupt handler

指明發(fā)生了內(nèi)核恐慌(kernel panic),原因是遇到了致命異常(Fatal exception),且該異常發(fā)生在中斷處理程序中。

CPU與進(jìn)程信息

CPU: 0 PID: 250 Comm: irq/10000000-mmc0 Not tainted 5.?.0-rc1 #1

表明出錯(cuò)的CPU核心是0號(hào),引發(fā)panic的進(jìn)程ID為250,進(jìn)程名為irq/10000000-mmc0,表示與MMC設(shè)備相關(guān)的中斷處理程序。內(nèi)核版本為5.?.0-rc1,編譯構(gòu)建編號(hào)為#1,并且內(nèi)核未被外部代碼污染(Not tainted)。

硬件信息

Hardware name: Generic AArch64 (DT)

說明運(yùn)行在Generic AArch64硬件平臺(tái)上,并使用設(shè)備樹(Device Tree, DT)作為硬件描述方式。

處理器狀態(tài)寄存器(PSTATE)值

pstate: 80000005 (Nzcv daif -PAN -UAO)

給出了當(dāng)前處理器狀態(tài)寄存器的值,反映了處理器的各種模式和標(biāo)志位狀態(tài)。在這個(gè)例子中,N、Z、C、V標(biāo)志分別代表負(fù)數(shù)、零、進(jìn)位、溢出,daif字段表示調(diào)試、中斷、故障、同步異常禁止位,PAN和UAO標(biāo)志分別與數(shù)據(jù)對(duì)齊異常和用戶地址中止有關(guān)。

程序計(jì)數(shù)器(PC)、鏈接寄存器(LR)、棧指針(SP)與寄存器備份

接下來是一系列寄存器的值,包括程序計(jì)數(shù)器(PC)、鏈接寄存器(LR)、棧指針(SP)以及其他通用寄存器(x0-x30)。這些信息值有助于定位發(fā)生異常時(shí)的指令位置和當(dāng)時(shí)的上下文環(huán)境。

Call trace

Call trace:
show_stack+0x14/0x20
dump_stack_lvl+0x40/0x58
dump_stack+0x.png
panic+0x17c/0x328
do_exit+0x2b8/0x45c
do_group_exit+0x3a/0xa0
SyS_exit_group+0x14/0x20
el0_svc_naked+0x28/0x2c
Modules linked in: [list of loaded modules]

展示了從異常發(fā)生點(diǎn)到panic函數(shù)調(diào)用的函數(shù)調(diào)用鏈,包括每個(gè)函數(shù)的地址偏移和函數(shù)總長(zhǎng)度。這會(huì)有助于追蹤導(dǎo)致panic的具體執(zhí)行路徑。此外,還列出了可能與問題相關(guān)的已加載模塊(Modules linked in)。

Kernel Offset & Relocation Range

Kernel Offset: 0x0000000000000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)

提供內(nèi)核在物理內(nèi)存中的加載偏移量,以及內(nèi)核可重定位范圍,有助于分析理解內(nèi)核映像在內(nèi)存中的布局。

結(jié)束標(biāo)記

---[ end trace 123456789abcdef0 ]---

Kernel panic - not syncing: Fatal exception in interrupt handler
Kernel Offset: 0x0000000000000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
---[ end Kernel panic - not syncing: Fatal exception in interrupt handler ]---

重復(fù)了panic的原因和內(nèi)核相關(guān)信息,作為結(jié)束標(biāo)記,便于識(shí)別panic信息的完整邊界。

總結(jié)

綜上所述,以Linux ARM64 panic打印信息為例看,其實(shí)包含了較多的診斷信息,可以幫助我們分析崩潰原因、定位錯(cuò)誤代碼位置,并結(jié)合其他調(diào)試手段(如內(nèi)核轉(zhuǎn)儲(chǔ)、日志記錄等)來定位和解決問題。所以,以后看到類似這種Linux panic信息,首先自己堅(jiān)決不能panic!要勇敢面對(duì)!才會(huì)get到后續(xù)的精彩知識(shí)!

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
EPCQ64ASI16N 1 Intel Corporation Memory Circuit, 8MX8, CMOS, PDSO16, SOIC-16

ECAD模型

下載ECAD模型
暫無數(shù)據(jù) 查看
AQY282S 1 Panasonic Electronic Components Solid State Relay,
$1.69 查看
ABM3C-25.000MHZ-D4Y-T 1 Abracon Corporation CRYSTAL 25.0000MHZ 18PF SMD

ECAD模型

下載ECAD模型
$2.57 查看

相關(guān)推薦

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

記錄和分享C/C++、Linux、ARM、Android、IoT相關(guān)知識(shí)。技術(shù)相伴于生活和成長(zhǎng),愿你我永為少年,心中有火,眼中有光,始保熱情。