2011-12-14 31 views
5

Tài liệu mmap nói sau về cờ MAP_NORESERVE.Không mmap với MAP_NORESERVE bộ nhớ vật lý dự trữ?

Không đặt chỗ trao đổi cho ánh xạ này. Khi không gian hoán đổi được đặt trước , người ta có bảo đảm rằng có thể sửa đổi ánh xạ . Khi không gian trao đổi không được bảo lưu, người ta có thể nhận SIGSEGV khi số ghi nếu không có bộ nhớ vật lý.

Điều tôi thực sự muốn chỉ dành cho các địa chỉ bộ nhớ ảo và không được cấp phát bộ nhớ vật lý thực tế. Điều này có thể được thực hiện với mmap với MAP_NORESERVE? Nếu tôi muốn sử dụng bất kỳ bộ nhớ vật lý nào, tôi sẽ mmap nó một lần nữa với MAP_FIXED trong dải địa chỉ trong phạm vi được phân bổ thông qua mmap với MAP_NORESERVE.

Để tóm tắt, tôi muốn hạt nhân không đặt trước bất kỳ trang vật lý nào cho bộ nhớ được cấp phát bằng mmap với cờ MAP_NORSERVE. Liệu nó thực sự làm việc như thế này hoặc làm hạt nhân phân bổ các trang vật lý nếu nó có đủ bộ nhớ vật lý?

+0

MAP_RESERVE không phải là về bộ nhớ vật lý (RAM) mà là về sao lưu (không gian hoán đổi). Bộ nhớ vật lý không bao giờ được bảo lưu (ngoại trừ một số ứng dụng đặc biệt như bộ nhớ hạt nhân hoặc shmem) – wildplasser

+1

Điều gì thực sự là không gian hoán đổi? Và làm thế nào MAP_RESERVE là thuận lợi trong lĩnh vực này, có nghĩa là, không phân bổ không gian trao đổi là hữu ích? – MetallicPriest

Trả lời

4

Mmap() là một trong những cách để quản lý liên kết giữa {address, Physical memory, disk-blocks} Tất cả ba thành viên của hiệp hội này là tài nguyên. Hiệp hội được giữ bên trong trang bảng mục (PTE của)

mmap gì() thực hiện, là:

  • [có lẽ] phân bổ địa chỉ tầm xa bên trong quá trình sử dụng. Dải ô này phải bao gồm các địa chỉ liên tiếp (không được chồng chéo với các dải ô hiện có)
  • tạo PTE cho phạm vi được yêu cầu và đặt chúng vào các trang trong phạm vi địa chỉ
  • làm cho điểm PTE của tệp là mmap() ed
  • [có thể] phân bổ và tìm nạp trước (một số) trang
  • [có thể] bảo lưu một số bộ nhớ sao lưu.

Nhiều (3 trong số 5) các bước trên là tùy chọn và phụ thuộc vào đối số thực tế và cờ được cung cấp trong lệnh mmap(). (fd có thể là -1: tạo ánh xạ ẩn danh, địa chỉ bắt đầu có thể là NULL: mmap nên cấp phát một dải bộ nhớ chưa sử dụng (trước đây)

Sau khi gọi đến mmap(), trình xử lý pagefault-handler bên trong hạt nhân sẽ có thể tìm hiểu phải làm gì. (Đính kèm ram vật lý tới một trang; tuôn ra và tách; phân bổ và COW, ...)

không đặt swapspace có nghĩa là người gọi tin tưởng rằng sẽ có đủ không gian swap bất cứ lúc nào trong thời gian tới.Không gian trao đổi được chia sẻ bởi tất cả các quy trình, vì vậy không bao giờ có thể đảm bảo rằng có đủ dung lượng. Preallocating nó (nhiều hơn hoặc ít hơn) cho một bảo lãnh rằng quá trình gọi sẽ luôn luôn có đủ của nó. (khi không: mmap() nên đã thất bại)

3

Trên Linux mmap chỉ thiết lập ánh xạ bộ nhớ ảo, cho dù bạn sử dụng MAP_NORESERVE hay không, không có bộ nhớ vật lý nào được gán cho đến khi bạn chạm vào bộ nhớ.

MAP_FIXED không liên quan đến điều này, nó thiết lập ánh xạ bộ nhớ ảo tại địa chỉ ảo (không phải vật lý) bạn chỉ định hoặc không thành công nếu không có chỗ cho ánh xạ tại địa chỉ đó.

3

Chỉ cần sử dụng bình thường mmap(). Bất kỳ hệ điều hành hiện đại nào đủ (ví dụ, quá khứ, cái gì, 1995?) Thực hiện mmap cũng thực hiện phân trang theo yêu cầu, và các trang sẽ chỉ được dành riêng nếu bạn thực sự viết thư cho chúng.

+1

Không sử dụng MAP_NORESERVE khi đặt bộ nhớ ảo đầu vào mà bạn không bao giờ cần là một cách chắc chắn để phá vỡ mọi thứ khi chạy phần mềm trên OpenVZ VPS hoặc bất kỳ phần mềm cách ly/ảo hóa nào khác với tính toán bộ nhớ bị hỏng. – voidlogic

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