2013-03-05 21 views
5

Tôi có một số mã tôi đang thử nghiệm trên Linux x86/x64. Tôi muốn tắt tính năng sửa lỗi tự động của dữ liệu lệch để mô phỏng điều gì sẽ xảy ra trên bộ xử lý ARM.Linux x86/x64: Tắt các bản sửa lỗi dữ liệu không được thiết kế

Trên Windows, tôi có thể làm điều đó với SetErrorMode and SEM_NOALIGNMENTFAULTEXCEPT.

Làm cách nào để tắt tính năng sửa lỗi trên Linux? Tôi không nhận được lỗi xe buýt tôi mong đợi để xem?

+0

Như một khoảng cách dừng, tôi đã tìm thấy các hành vi undefined Sanitizer để GCC và Clang hữu ích ở đây vì tải không đúng là hành vi không xác định (*** '-fsanitize = undefined' ***). – jww

Trả lời

6

Tôi thực sự không hoàn toàn chắc chắn nếu nó có thể tắt tính năng tự động sắp xếp được hỗ trợ bởi x86x86_64 vi xử lý (nó đã là một phần của quyền kiến ​​trúc của Intel từ i386 hoặc i486 ngày và là một trong những bán chốt điểm cho kiến ​​trúc).

Dựa trên Intel® 64 and IA-32 Architectures Software Developer’s Manual, trang 6-45 dưới phần Interrupt 17—Alignment Check Exception (#AC):

Interrupt 17-Alignment Kiểm tra ngoại lệ (#AC)

Exception Lớp lỗi.

Mô tả

Chỉ ra rằng bộ vi xử lý phát hiện một toán hạng bộ nhớ unaligned khi kết việc kiểm tra được kích hoạt. Kiểm tra căn chỉnh chỉ được thực hiện trong dữ liệu (hoặc ngăn xếp) truy cập (không phải trong mã tìm nạp hoặc phân đoạn hệ thống truy cập). Ví dụ về vi phạm kiểm tra căn chỉnh là một từ được lưu trữ tại địa chỉ byte lẻ hoặc một từ kép được lưu trữ tại địa chỉ không phải bội số nguyên của 4. Bảng 6-7 liệt kê các yêu cầu khác nhau bộ xử lý.

Lưu ý rằng ngoại lệ kiểm tra căn chỉnh (#AC) chỉ được tạo cho loại dữ liệu phải được căn chỉnh theo các từ, từ kép và quadword đường biên. Ngoại lệ bảo vệ chung (#GP) được tạo ra 128-bit loại dữ liệu không được căn chỉnh trên ranh giới 16 byte.

Có một bảng mô tả các yêu cầu liên kết với nhiều loại dữ liệu khác nhau, tiếp theo là các điều kiện cần được đáp ứng để cho phép kiểm tra sự liên kết:

• AM flag in CR0 register is set. 
• AC flag in the EFLAGS register is set. 
• The CPL is 3 (protected mode or virtual-8086 mode). 

Vì vậy, nếu bạn có thể làm điều này trong lắp ráp trong bắt đầu chương trình của bạn, bạn có thể đạt được ngoại lệ liên kết.

Cũng có vẻ như chỉ mã chế độ sử dụng có thể tạo ra #AC:

ngoại lệ Alignment-séc (#AC) được tạo ra chỉ khi hoạt động ở mức đặc quyền 3 (chế độ người dùng). tài liệu tham khảo bộ nhớ mặc định để đặc ân mức 0, chẳng hạn như tải mô tả phân đoạn, không tạo ngoại lệ liên kết kiểm tra, ngay cả khi gây ra bởi một tham chiếu bộ nhớ làm từ mức đặc quyền 3.

đang dùng không thể cài đặt trực tiếp AM trong CR0 mà không có sự trợ giúp từ Hệ điều hành.

Vì vậy, để trả lời câu hỏi của bạn, Linux có thể đã có mã để xử lý INT 17h, hãy thử tìm kiếm thông qua các nguồn hạt nhân để xem bạn có thể tìm thấy bất kỳ tham chiếu nào không. Nó phải ở trong mã kiến ​​trúc cụ thể.

Ngoài ra một số chủ đề liên quan về SO mà có thể cung cấp cho bạn một số gợi ý:

Các vấn đề liên quan