2017-01-30 86 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硬件没有响应。所以,只有内核才能处理错误是合适的。

错误不会传播到用户级别,因为这不是软件故障。所以,我们没有得到核心转储(内核或用户空间),因为它不是软件故障。

内核中的机器检查异常处理程序告诉硬件故障是什么,以及什么地址/数据是相关的(取决于原因) - 需要进一步从硬件角度进行调查。