Mục đích của khu vực màu đỏ là gì?


12

Vùng màu đỏ là vùng có kích thước cố định trong bộ nhớ ngoài con trỏ ngăn xếp chưa được "cấp phát". Trình biên dịch tạo ra lắp ráp để truy cập vào khu vực đó trong các chức năng lá đơn giản.

Nhưng tôi không thể thấy bất kỳ lợi thế thực sự cho vùng màu đỏ. Truy cập bộ nhớ ngoài con trỏ ngăn xếp thực sự nguy hiểm và có thể dễ dàng dẫn đến hỏng dữ liệu . Tại sao thậm chí làm điều này? Lưu 2 hướng dẫn bộ xử lý (đẩy ebp; Mov ebp Esp) sẽ không tăng tốc thực sự.

Câu trả lời:


16

Vùng màu đỏ, hoàn toàn và đơn giản, là một tối ưu hóa có thể lưu các hướng dẫn. Điều đó có nghĩa là không còn cần thiết cho mã được phát ra cho mọi hàm để trừ khỏi con trỏ ngăn xếp để tạo bộ nhớ cục bộ như vậy

sub XXX, %rsp 

ở đầu mỗi lệnh gọi hàm, ngay cả khi chúng không phải là hàm lá. Thông thường, mã được phát ra từ trình biên dịch có thể sử dụng không gian tạm thời trong vùng màu đỏ bên dưới con trỏ ngăn xếp mà không cần lưu nó và trước khi gọi các hàm khác. Đây là một tối ưu hóa hữu ích để có sẵn.

Nếu bạn không còn phải phụ từ con trỏ ngăn xếp, mã được phát có thể sử dụng rsp làm con trỏ cơ sở, một công việc thường dành cho rbp và mã được phát có thể sử dụng rbp làm một thanh ghi mục đích chung khác.

Điều này cuối cùng có nghĩa là phần mở đầu và phần kết của mỗi lệnh gọi hàm có thể lưu hai hướng dẫn sẽ lưu và khôi phục rbp:

(người lắp ráp gnu)

pushq %rbp       # prologue [ two instructions not necessary ]
movq %rsp,%rbp

.... [code]

movq %rbp,%rsp   # epilogue [ two instructions not necessary ]
popq %rbp        

Lưu ý rằng trong gcc, bạn có thể vượt qua cờ -mno-red-nếu bạn không muốn nó (nhưng ABI x86-64 yêu cầu nó). Hạt nhân Linux không cần phải tuân thủ ABI và do đó tất cả mã hạt nhân được biên dịch với -mno-red-zone.

Hơn nữa, truy cập bộ nhớ ngoài con trỏ ngăn xếp không nguy hiểm nếu đó là chế độ hoạt động dự kiến. Nó chỉ nguy hiểm và có thể dẫn đến tham nhũng khi không có kế hoạch và bất ngờ. Khi mã được phát ra, nó biết nó đang làm gì.


Vâng, tôi hiểu điều này. Nhưng việc lưu 1 hướng dẫn (phụ từ đặc biệt) có thực sự tối ưu hóa? Tôi có nghĩa là tiết kiệm vài byte và 1 chu kỳ bộ xử lý với giá khả năng thực sự của dữ liệu bị hỏng trông có vẻ lạ. Có lẽ có bất kỳ lý do khác để làm điều đó?
Alexander Dzyoba

3
Nó không thực sự là phụ từ đặc biệt là tối ưu hóa, nhưng vì bạn không còn phải phụ từ đặc quyền, bạn có thể sử dụng đặc biệt làm con trỏ cơ sở (thường được thực hiện bởi ebp) và sử dụng ebp cho một thứ khác trong mã chức năng. Cuối cùng, vì đặc biệt bây giờ là con trỏ cơ sở, mã có thể tránh lưu và khôi phục ebp trong phần mở đầu / đoạn kết. Tôi sẽ làm rõ câu trả lời với thông tin bổ sung này
Brian Onn

chỉnh sửa và thay đổi thành rbp / rsp thay vì ebp / Esp vì vùng màu đỏ chỉ là một phần của x86-64 ABI (mặc dù không có gì ngăn người ta sử dụng kỹ thuật tương tự với các thanh ghi 32 bit; nhưng không có trình biên dịch nào làm như vậy ngày nay)
Brian Onn

1
Bỏ sót con trỏ khung hoàn toàn không liên quan đến vùng màu đỏ - trình biên dịch có thể lập chỉ mục ngăn xếp bằng cách sử dụng %rspnhư một con trỏ cơ sở.
alecov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.