Để làm bẩn trang (bật bit bẩn trong mục nhập bảng trang), tôi chạm vào các byte đầu tiên của trang như sau:
pageptr[0] = pageptr[0];
Nhưng trong thực tế, gcc sẽ bỏ qua câu lệnh bằng cách loại bỏ cửa hàng chết. Để ngăn gcc tối ưu hóa nó, tôi viết lại câu lệnh như sau:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
Có vẻ như thủ thuật này hoạt động, nhưng hơi xấu xí. Tôi muốn biết có bất kỳ chỉ thị hoặc cú pháp nào có tác dụng tương tự không? Và tôi không muốn sử dụng một -O0
lá cờ, vì nó cũng sẽ mang lại hình phạt hiệu quả cao.
-O0
cũng không ngăn chặn được "tối ưu hóa" mã chết, ví dụ: khi GCC phát hiện một số mã không có tác dụng, nó chỉ cần loại bỏ nó. AFAIK đây là một giai đoạn thậm chí trước đó -O0
... Nhưng đó chỉ là kinh nghiệm của tôi