2012-02-26 18 views
8

Khi nghiên cứu các hệ điều hành (chủ yếu với Linux làm tài liệu tham khảo), có một vài điểm mà tôi không tìm được giải thích rõ ràng trong tài liệu mà tôi đã nghiên cứu.Phân đoạn bộ nhớ trong các hệ điều hành hiện đại

Chương trình được tải vào bộ nhớ thường được mô tả như được chia thành các phân đoạn văn bản, dữ liệu, ngăn xếp, v.v. ngay cả trong ngữ cảnh hệ điều hành như Linux nơi bộ nhớ ảo dựa hoàn toàn vào phân trang. Có phải đó là trường hợp mà nó chỉ là chương trình, và không phải là bộ nhớ chính nó được gọi là phân đoạn? Nếu vậy, tôi thấy thuật ngữ khó hiểu.

Tôi thấy rằng malloc có thể được triển khai trong Linux bằng cách sử dụng cuộc gọi 'sbrk' làm tăng kích thước của phân đoạn dữ liệu. Một lần nữa, đây có phải là 'phân đoạn dữ liệu' chỉ là một vùng bộ nhớ được sử dụng cho dữ liệu theo quy ước và không phải là phân đoạn 'thực'? (Câu hỏi thêm: 'sbrk' dường như không thể giảm kích thước của 'phân đoạn'. Điều này có nghĩa là một quá trình không bao giờ có thể giải phóng bộ nhớ cho hệ điều hành khác ngoài việc bỏ?)

Ngoài ra tôi quan tâm đến biết lý do tại sao các hệ điều hành hiện đại dường như không sử dụng phân đoạn (phân trang). Nó sẽ không ngăn chặn một số loại tấn công nhất định để có mã nằm trong phân khúc được bảo vệ riêng của nó, do đó tăng cường bảo mật? Mặt khác, điều này sẽ làm cho ví dụ JIT biên dịch không thể/khó khăn?

Bên cạnh câu trả lời "có"/"không" cho các câu hỏi ở trên, tôi quan tâm đến bất kỳ việc xây dựng sâu sắc nào về chủ đề này.

Cảm ơn bạn trước.

+0

Ngoài ra còn có 'brk', mà * có thể * thiết lập ngắt chương trình đến một giá trị thấp hơn. Và các phân đoạn * được phân chia thành các trang và mỗi trang * có thể * thực sự là chỉ đọc hoặc không thực thi, và đoạn văn bản và phân đoạn dữ liệu ro thường sẽ được đặt như vậy. –

Trả lời

4

Phân đoạn trong "phân đoạn dữ liệu" không có gì liên quan đến phân đoạn phần cứng, là tính năng ít liên quan đến hệ điều hành hiện đại (nghĩa là dư thừa về phân trang) dựa trên phân trang để triển khai bộ nhớ ảo. Các phân đoạn cũng có những hạn chế nghiêm trọng so với phân trang (ví dụ: bộ nhớ tiếp giáp trong phân đoạn phải tiếp giáp về mặt vật lý) mà không có bất kỳ lợi ích nào. Bởi "phân đoạn" cho các chương trình không gian người dùng, một nghĩa đen có nghĩa là một phần liền kề của không gian ảo của tiến trình.

Nhiều kiến ​​trúc không còn phân đoạn nữa. Trên x86, phân đoạn chỉ là trọng tải lịch sử và được thiết lập để có mã và phân đoạn dữ liệu bao trùm toàn bộ không gian địa chỉ vì không thể bỏ qua phân khúc.

Câu hỏi của bạn về giải phóng bộ nhớ được thông qua sbrk được trả lời ở đây: How do I free memory obtained by sbrk()?

+0

Cảm ơn bạn đã trả lời. Có cách nào chúng tôi có thể hưởng lợi từ phân khúc _paged_ không? Dường như với tôi rằng việc phân đoạn trong phân đoạn thực tế với không gian địa chỉ riêng của họ sẽ đơn giản hóa việc quản lý bộ nhớ và loại bỏ khả năng ngăn xếp và phân đoạn dữ liệu tiếp cận nhau. Việc xử lý phân đoạn có thể được xử lý bởi trình biên dịch/trình liên kết. Ở mức nào, tôi nghĩ rằng việc sử dụng từ "phân đoạn" trong phân đoạn dữ liệu, vv chỉ là yêu cầu cho sự nhầm lẫn. Tôi đoán tôi nên thêm một số ghi chú định hướng vào một số trang wikipedia :) –

+1

@Gnurou Tôi nghĩ rằng bạn đã có hỗn hợp lên. phân đoạn x86 được xác định trong không gian địa chỉ _linear_ (nghĩa là ảo), có nghĩa là phân trang xuất hiện sau khi phân đoạn. Điều này được nêu rõ trong phần 3.1 của sách hướng dẫn dành cho nhà phát triển kiến ​​trúc Intel® 64 và IA-32: Vol. 3A] (http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html). – reima

+0

reima: bạn đúng - cảm ơn vì đã chỉ ra. Xóa các nhận xét này. – Gnurou

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