tôi sử dụng sigaction để xử lý ngoại lệ lỗi trang, và các chức năng xử lý là defind như thế này:Làm thế nào để xác định đọc hoặc viết hoạt động của lỗi trang khi sử dụng bộ xử lý sigaction trên SIGSEGV (LINUX)
void sigaction_handler(int signum, siginfo_t *info, void *_context)
Vì vậy, nó là dễ dàng nhận được địa chỉ lỗi trang bằng cách đọc thông tin-> si_addr.
Câu hỏi đặt ra là, làm thế nào để biết liệu hoạt động này là bộ nhớ ĐỌC hoặc VIẾT?
tôi thấy loại _context tham số là ucontext_t quy định tại/usr/include/sys/ucontext.h
Có một lĩnh vực CR2 quy định tại mcontext_t, nhưng Unforunately, nó chỉ là sẵn khi x86_64 không được xác định, vì vậy tôi không thể sử dụng cr2 để xác định các hoạt động đọc/ghi.
On anotherway, có một struct tên sigcontext quy định tại/usr/include/bit/sigcontext.h struct này chứa CR2 lĩnh vực. Nhưng tôi không biết phải lấy đâu.
Thông tin error_code có thể được truy cập thông qua: ((ucontext_t *) ngữ cảnh) -> uc_mcontext.gregs [REG_ERR]. Nó được thông qua bởi phần cứng trên ngăn xếp, sau đó được truyền tới bộ xử lý tín hiệu bởi hạt nhân, vì hạt nhân truyền toàn bộ 'khung '. –
M. Alaggan, phần cứng nào? – osgx
Tôi đã thử trên x86-64. –