2017-01-30 97 views
2

我的子進程正試圖訪問一個PCI地址空間。大多數時候它都能正常工作。子進程不生成核心只有SIGBUS錯誤,併成爲殭屍進程

但是,有時兒童進程會進入殭屍狀態。 dmesg日誌顯示以下總線錯誤。

[ 501.134156] Caused by (from MCSR=10008): Bus - Read Data Bus Error 
[ 501.134169] Oops: Machine check, sig: 7 [#1] 

這種情況下沒有生成核心文件。

[Linux:/]$ ps -axl | grep tes1 
4  0 6805 32495 20 0  0  0 exit Zl ? 0:05 [test1] <defunct> 
[Linux:/]$ 

核心是由子進程爲SIGSEGV錯誤生成的。所以我認爲它與permission/ulimit設置無關。

有人可以幫助我理解爲什麼核心在這種情況下不會生成?

Child Process: 
-------------- 

[Linux:/]$ cat /proc/6805/status 
Name: test1 
State: Z (zombie) 
Tgid: 6805 
Pid: 6805 
PPid: 32495 
TracerPid: 0 
Uid: 0 0 0 0 
Gid: 0 0 0 0 
FDSize: 0 
Groups: 
Threads: 2 
SigQ: 18/13007 
SigPnd: 0000000002000000 
ShdPnd: 0000000000000000 
SigBlk: 0000000000000000 
SigIgn: 0000000000001006 
SigCgt: 0000000182000200 
CapInh: 0000000000000000 
CapPrm: 0000001fffffffff 
CapEff: 0000001fffffffff 
CapBnd: 0000001fffffffff 
Seccomp: 0 
Cpus_allowed: 3 
Cpus_allowed_list: 0-1 
voluntary_ctxt_switches: 8998 
nonvoluntary_ctxt_switches: 857 

    Stack: 
    ------- 

[Linux:/]$ cat /proc/6805/stack 
[<00000000>] (nil) 
[<c0008640>] __switch_to+0xc0/0x160 
[<c004b4f4>] do_exit+0x5d4/0xa70 
[<c000c694>] die+0x224/0x310 
[<c000ce44>] machine_check_exception+0x124/0x1e0 
[<c00123bc>] ret_from_mcheck_exc+0x0/0x14c 
[Linux:/]$ 


Parent Process: 
--------------- 
[Linux:/]$ cat /proc/32495/status 
Name: test 
State: S (sleeping) 
Tgid: 32495 
Pid: 32495 
PPid: 21911 
TracerPid: 0 
Uid: 0 0 0 0 
Gid: 0 0 0 0 
FDSize: 256 
Groups: 
VmPeak:  4820 kB 
VmSize:  4820 kB 
VmLck:   0 kB 
VmPin:   0 kB 
VmHWM:  2548 kB 
VmRSS:  2548 kB 
VmData:  1284 kB 
VmStk:  132 kB 
VmExe:  900 kB 
VmLib:  1976 kB 
VmPTE:  24 kB 
VmSwap:  0 kB 
Threads: 1 
SigQ: 19/13007 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000000 
SigBlk: 0000000000010000 
SigIgn: 0000000000001006 
SigCgt: 0000000043816ef9 
CapInh: 0000000000000000 
CapPrm: 0000001fffffffff 
CapEff: 0000001fffffffff 
CapBnd: 0000001fffffffff 
Seccomp: 0 
Cpus_allowed: 3 
Cpus_allowed_list: 0-1 
voluntary_ctxt_switches: 274 
nonvoluntary_ctxt_switches: 145 
[Linux:/]$ 
+0

我假設你已經檢查了你的代碼,看看你在讀取失敗後是否故意/意外退出。假設父母仍然活着,您是否可以等孩子讀取退出狀態並返回代碼? – Ram

+0

父進程是一個shell腳本文件,它啓動子進程並等待其PID。 –

+0

父進程沒有意識到Child的SIGBUS崩潰並仍在等待其PID。 子進程在嘗試從其中一個PCI設備寄存器讀取時獲取SIGBUS。我不退出這個孩子的過程,一旦發生閱讀失敗就會進入殭屍狀態。 –

回答

0

據我所知,mmaped的PCI硬件沒有響應。所以,只有內核才能處理錯誤是合適的。

錯誤不會傳播到用戶級別,因爲這不是軟件故障。所以,我們沒有得到核心轉儲(內核或用戶空間),因爲它不是軟件故障。

內核中的機器檢查異常處理程序告訴硬件故障是什麼,以及什麼地址/數據是相關的(取決於原因) - 需要進一步從硬件角度進行調查。