Subject: Re: What is difference between SIGSEGV and SIGBUS
To: None <greywolf@tomcat.VAS.viewlogic.com>
From: Greg Troxel <gdt@sunpal1.mit.edu>
List: current-users
Date: 08/05/1995 11:11:08
Back in the days of PDP-11s, Version 6 and 7 and BSD 2.8, I believe
these were meant to correspond to processor traps.
There are two reasons (at least) on an 11 that a memory reference can
fail:
segmentation violation: The memory map for the process does not
map that address (8 segments, each with length, protection
and physical address).
bus error: The memory map maps that address, but the bus access
timed out.
A segmentation violation occurs when you access memory that the OS has
not set up for you to access. A bus error happens when the memory
doesn't respond. More commonly, it happens when the 'memory' is
really IO space, where only a few locations are valid.
In BSD today, with programs that have not mmap()'ed IO space, I would
argue that dereferencing a bogus pointer should in most cases get you
SEGV.
This is the only thing that can explain why I get a SIGBUS when
doing something which amounts to "fprintf(0, string, arg, arg2);", and
get a SEGV when doing something which amounts to
"fprintf((FILE *)some-other-weird-but-undefined-addr, string, arg, arg2);"
Or perhaps the kernel explicitly delivers SIGBUS for NULL pointer,
because user programs should never normally get this, and thus it's a
hint that you did this.