2011-11-02 27 views
5

Nếu tôi đã mmap() một số PRIVATEANONYMOUS trang và sau đó mở rộng chúng với mremap(), làm không gian mới cũng được khởi tạo zero?Liệu có tạo ra bộ nhớ "khởi tạo" trên sự tăng trưởng?

Tôi đã thử đọc mã cho mremap (mm/mremap.c) trong nguồn linux nhưng yêu cầu một số kiến ​​thức về miền cụ thể mà hiện tại tôi không có (vma _ ### stuff). Thậm chí không chắc chắn đó là đúng nơi để tìm ...

Nhưng, từ những gì tôi đã thu thập được tôi nghĩ rằng mremap() bộ nhớ ed sẽ được xóa, điều này có đúng không?

Phân bổ được thực hiện như thế này

list = mmap(NULL, newSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) 

và sau đó remap được thực hiện như

newList = mremap(list, oldSize, newSize, MREMAP_MAYMOVE) 

Ah này, và cuối cùng, đó là một Linux câu hỏi cụ thể, chạy một hạt nhân gần đây (> = 2.6.28) và libc (> = 2.11.1)

Trả lời

4

Trang ẩn danh là ánh xạ copy-on-write của th e trang không phổ dụng. Họ luôn luôn là (trên mọi hệ thống, không chỉ Linux, cung cấp ánh xạ ẩn danh) và sẽ luôn như vậy. Khi mremap (hoặc brk) mở rộng ánh xạ ẩn danh, bạn sẽ nhận được các trang ẩn danh (số không) mới. Không cần phải tự khởi tạo chúng.

+0

Đúng. Bất kỳ trang nào ngoài 0 trang cũng sẽ là một lỗ hổng bảo mật. –

+0

Bạn đang nhầm lẫn về ánh xạ copy-on-write của trang zero phổ quát. Ít nhất trên Linux, đây không phải là cách 'mmap()' hoạt động. Bạn nhận được các trang vật lý được ánh xạ trên quyền truy cập đầu tiên vào bộ nhớ được ánh xạ, và đây là trình xử lý lỗi trang hạt nhân để làm nổi bật trang vật lý và ánh xạ nó. Không có trang phổ dụng nào có liên quan. –

+1

Bạn có chắc chắn không? Chắc chắn đối với các ánh xạ ẩn danh chỉ đọc, nó không tạo ra một trang vật lý cho mỗi trang. Những gì tôi nói là chắc chắn đúng theo nghĩa nếu bạn cho phép hợp nhất các trang trùng lặp, nhưng tôi có thể sai nói chung; Tôi đã không RTFS'd hoặc thử nghiệm nó. –

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