SIGBUS en x86 (incluido x86_64) Linux es una bestia rara. Puede aparecer desde un intento de acceso más allá del final del archivo ed mmap
, o en algunas otras situaciones descritas por POSIX.
Pero por fallas de hardware no es fácil obtener SIGBUS. A saber, el acceso desalineado de cualquier instrucción, ya sea SIMD o no, generalmente da como resultado SIGSEGV. El desbordamiento de pila resulta en SIGSEGV. Incluso los accesos a direcciones que no están en forma canónica resultan en SIGSEGV. Todo esto debido a que #GP se está levantando, lo que casi siempre se asigna a SIGSEGV.
ahora, Acá algunas maneras de conseguir SIGBUS debido a una excepción de la CPU:
bit de habilitación de CA en EFLAGS
, y luego hacer el acceso no alineado por cualquier memoria de lectura o escritura de instrucciones. Vea this discussion para más detalles.
Violación canónica a través de un registro de puntero de pila (rsp
o rbp
), generando #SS.He aquí un ejemplo para GCC (compilar con gcc test.c -o test -masm=intel
):
int main()
{
__asm__("mov rbp,0x400000000000000\n"
"mov rax,[rbp]\n"
"ud2\n");
}
El depurador mostró que el SIGBUS se produjo inmediatamente después de ingresar a la función. Tal vez tengo un poco de corrupción en la memoria, o tal vez uno de los parámetros de la función es malo? Tendré que verificar el desmontaje en el depurador para obtener más detalles si el error vuelve a ocurrir. –
@Josh: compruebe para ver cuál es la instrucción que falla realmente: si es un impulso o pop, su puntero de pila está dañado. Si es algo más, entonces la dirección en la instrucción es el problema. –