宿主機配置(zhi):Intel 8378 cpu + ctyunos 64內核, cpu 微碼(ma)版本:0d000311
卡死時的vmcore-dmesg.txt 中call trace如下:

圖-1
crash調試bt如下:

圖-2

圖-3
異常地(di)址(zhi)0xfffef7efbfee2dba,但查(cha)看該地(di)址(zhi)也不在正常的(de)內核地(di)址(zhi)映射(she)范圍之(zhi)內:

圖-4
內核異常時的錯誤碼為0x0010,對應指令預取造成

圖-5
反匯編EIP對應地址為

圖-6
從上邊堆棧IP的值是0xffffffff8c6e1e40,也就是x86_sys_ioctl的入口(kou)地址。
也就是說異常發生在(zai)x86_sys_ioctl的入口地址。
那我(wo)們看看是如何跳(tiao)轉(zhuan)到x86_sys_ioctl,跳(tiao)轉(zhuan)過(guo)程中有(you)無異常。
__x64_sys_ioctl的(de)更上一層的(de)棧(zhan)信息(_MODULE_START_syshook_linux at ffffffffc08e5b93 [syshook_linux])如下:

圖-7
上一個堆棧發生問題的地方是一條跳轉指令,反匯編跳轉地址0xffffffff8d003000。

圖-8
此處進入__x64_sys_ioctl路徑如下:
這個函(han)數(shu)開始就執行了一(yi)條跳轉指令,跳轉到rax,根(gen)據(ju)上面(mian)異常堆棧的情況,rax的值為
0xffffffff8c6e1e40,也就是跳轉到(dao)__x64_sys_ioctl時發生了異常。
call 0xffffffff8d003000àjmpq *raxà__x64_sys_ioctl
結論:
從上面的分析日志和分析可以看出,內存中RAX和IP寄存器的值是正確的,不存在內存中IP地址非法的問題。但在跳轉過程中,cpu IP寄存器得到了一個非法地址,導致cpu指令預取失敗,內核crash。后續intel加入分析,發現有一個微碼bug和此問題類似,主機更新微碼后未再出現。
此類問題(ti)單純從軟件分析會(hui)發現(xian)非常奇怪,代碼(ma)突然跑飛(fei),此時可(ke)以(yi)考(kao)慮微碼(ma)問題(ti),可(ke)升級到最新微碼(ma)再(zai)驗證。