SIGBUS trên x86 (bao gồm x86_64) Linux là một con thú quý hiếm. Nó có thể xuất hiện từ nỗ lực truy cập vào cuối tệp mmap
ed hoặc một số tình huống khác được mô tả bởi POSIX.
Nhưng do lỗi phần cứng, việc lấy SIGBUS không dễ dàng. Cụ thể là, truy cập không được gán từ bất kỳ lệnh nào - có thể là SIMD hay không - thường là kết quả trong SIGSEGV. Chồng tràn kết quả trong SIGSEGV. Ngay cả khi truy cập vào các địa chỉ không có dạng thức kinh điển dẫn đến SIGSEGV. Tất cả điều này do #GP được nâng lên, hầu như luôn luôn ánh xạ tới SIGSEGV.
Bây giờ, here're một số cách để có được SIGBUS do một ngoại lệ CPU:
Enable AC bit trong EFLAGS
, sau đó làm truy cập unaligned bởi bất kỳ bộ nhớ đọc hoặc viết hướng dẫn. Xem this discussion để biết chi tiết.
Vi phạm chính tắc qua đăng ký con trỏ ngăn xếp (rsp
hoặc rbp
), tạo #SS.Dưới đây là một ví dụ cho GCC (biên dịch với gcc test.c -o test -masm=intel
):
int main()
{
__asm__("mov rbp,0x400000000000000\n"
"mov rax,[rbp]\n"
"ud2\n");
}
Trình gỡ lỗi cho thấy SIGBUS xảy ra ngay lập tức khi nhập hàm. Có lẽ tôi có một số tham nhũng bộ nhớ, hoặc có thể một trong các thông số chức năng là xấu? Tôi sẽ phải kiểm tra việc tháo gỡ trong trình gỡ rối để biết thêm chi tiết nếu lỗi xảy ra lần nữa. –
@Josh - kiểm tra xem hướng dẫn thất bại thực sự là gì - nếu nó là push hay pop thì con trỏ ngăn xếp của bạn bị hỏng. Nếu một cái gì đó khác của nó, sau đó địa chỉ trong hướng dẫn là vấn đề. –