Tôi nghĩ rằng tôi hiểu sự liên kết bộ nhớ, nhưng những gì gây nhầm lẫn cho tôi là địa chỉ của một con trỏ trên một số hệ thống sẽ có trong bộ nhớ ảo, phải không? Vì vậy, hầu hết các kiểm tra/đảm bảo liên kết tôi đã thấy dường như chỉ sử dụng địa chỉ con trỏ. Có thể địa chỉ bộ nhớ vật lý sẽ không được căn chỉnh không? Không phải là vấn đề đối với những thứ như SSE sao?Bộ nhớ ảo và căn chỉnh - chúng kết hợp với nhau như thế nào?
Trả lời
Địa chỉ thực sẽ được căn chỉnh vì bộ nhớ ảo chỉ ánh xạ các trang được căn chỉnh với bộ nhớ vật lý (và các trang thường là 4KB).
Vì vậy, trừ khi bạn cần căn chỉnh> kích thước trang, bộ nhớ vật lý sẽ được căn chỉnh theo yêu cầu của bạn.
Trong trường hợp cụ thể của SSE, mọi thứ hoạt động tốt vì bạn chỉ cần căn chỉnh 16 byte.
Tôi không biết bất kỳ hệ thống thực tế nào trong đó địa chỉ bộ nhớ ảo được căn chỉnh có thể dẫn đến địa chỉ bộ nhớ vật lý không được căn chỉnh.
Thông thường, tất cả các sắp xếp trên một nền tảng nhất định sẽ là quyền hạn của hai nền tảng. Ví dụ, trên các số nguyên 32 bit x86 có liên kết tự nhiên là 4 byte (2^2). Kích thước trang - xác định mức độ phạt của một khối bạn có thể ánh xạ trong bộ nhớ vật lý - thường là lớn sức mạnh của hai. Trên x86, kích thước trang nhỏ nhất cho phép là 4096 byte (2^12). Kiểu dữ liệu lớn nhất có thể cần căn chỉnh trên x86 là
128 bit (đối với thanh ghi XMM và CMPXCHG16B)
32 byte (đối với AVX) - 2^5. Vì 2^12 chia hết cho 2^5, bạn sẽ thấy rằng mọi thứ sắp xếp ngay tại đầu trang và vì các trang được căn chỉnh cả trong bộ nhớ ảo và vật lý, địa chỉ được căn chỉnh ảo sẽ luôn được căn chỉnh về mặt vật lý. Trên một mức độ thực tế hơn, cho phép các địa chỉ ảo liên kết ánh xạ tới các địa chỉ vật lý không được chỉ định sẽ làm cho nó khó thực sự tạo mã, nó cũng làm cho cấu trúc CPU phức tạp hơn hơn là cho phép bất kỳ sự liên kết nào (kể từ bây giờ chúng tôi có các trang có kích thước lẻ và sự kỳ quặc khác ...)
Lưu ý rằng bạn có thể có lý do để yêu cầu sắp xếp lớn hơn một trang theo thời gian. Thông thường, đối với mã hóa không gian người dùng, nó không quan trọng nếu điều này là phù hợp trong RAM vật lý (cho rằng vấn đề, nếu bạn đang yêu cầu nhiều trang, nó có thể thậm chí không liền kề!). Vấn đề ở đây chỉ phát sinh nếu bạn đang viết một trình điều khiển thiết bị và cần một khối liên kết lớn, liên kết cho DMA. Nhưng thậm chí sau đó thường thì thiết bị không phải là một người gắn bó về sự liên kết kích thước lớn hơn so với trang.
Trên thực tế, kiểu dữ liệu lớn nhất có thể cần căn chỉnh trên x86 hiện là 32 byte - cho AVX. Ngoài ra còn có các trường hợp khác mà bạn có thể yêu cầu căn chỉnh> 32 byte - không phải là hiếm khi yêu cầu phân bổ động được căn chỉnh theo trang. –
Tôi không có chuyên gia về mô hình bộ nhớ mức thấp (bao gồm cả căn chỉnh). Nhưng tôi sẽ nghĩ rằng các trang sẽ được căn chỉnh, mà tôi sẽ giả định sẽ làm cho bất kỳ con trỏ tương đối nào trong các trang đó được tự động căn chỉnh. –
Vâng, có vẻ như những gì tôi không hiểu là bộ nhớ ảo. –