2014-07-03 49 views
6

Không ai biết tại sao mmap() trả về MAP_FAILED thay vì NULL? Dường như MAP_FAILED là (void *) - 1 trên hầu hết các hệ thống. Tại sao không mmap() chỉ cần sử dụng NULL thay vào đó? Tôi biết rằng địa chỉ 0x0 về mặt kỹ thuật là một trang bộ nhớ hợp lệ, trong khi (void *) - 1 sẽ không bao giờ là một trang hợp lệ. Tuy nhiên, tôi đoán là mmap() sẽ không bao giờ thực sự trả về trang 0x0 trong thực tế. Trên Windows, ví dụ, VirtualAlloc() trả về NULL do lỗi.Tại sao mmap() sử dụng MAP_FAILED thay vì NULL?

Có an toàn để giả định rằng mmap() sẽ không bao giờ trả về 0x0 không? Có lẽ một cuộc gọi thành công đến mmap() phải trả lại bộ nhớ khả dụng cho người gọi. Địa chỉ 0x0 không bao giờ có thể sử dụng được, vì vậy nó sẽ không bao giờ được trả lại khi thành công. Hoàn cảnh đó sẽ làm cho nó có vẻ hợp lý khi sử dụng 0x0 như là người gửi lỗi, đó là lý do tại sao tôi bối rối trước sự tồn tại của MAP_FAILED ngay từ đầu.

Trả lời

6

Có một số trường hợp hiếm hoi khi mmap() thực sự sẽ tạo bản đồ tại địa chỉ 0x0. Những ngày này, nó thường đòi hỏi quyền root (hoặc cho mmap_min_addr sysctl được thiết lập để không trên hệ thống Linux) nhưng nó là có thể. Nếu một ánh xạ được tạo ra, nó có thể ghi vào địa chỉ này. Mặt khác,

MAP_FAILED không bao giờ là giá trị trả lại hợp lệ từ mmap(), vì vậy nó có thể sử dụng như một dấu bưu điện.

+0

Điều đó rất thú vị về mmap_min_addr. Vì vậy, có vẻ như bạn thực sự có thể yêu cầu ánh xạ tại địa chỉ 0x0 trong một số trường hợp. Cho rằng, cho phép tôi để cung cấp cho cụ thể hơn cho câu hỏi của tôi. Tôi hỏi về việc liệu mmap() sẽ bao giờ trả về NULL trong thực tế, nhưng những gì tôi thực sự có nghĩa là để hỏi xem liệu một cuộc gọi MAP_ANON như mmap (NULL, kích thước, cờ, MAP_ANON | MAP_PRIVATE, -1, 0) sẽ bao giờ trở lại null trong thực tế. Đó là trường hợp sử dụng thực tế của tôi, vì vậy đó là điều tôi thực sự tò mò. –

+1

Không, 'mmap()' sẽ không bao giờ trả về ánh xạ tại địa chỉ đó trừ khi bạn yêu cầu nó bằng 'MAP_FIXED'. – duskwuff

+0

@duskwuff Tôi khá chắc chắn bạn đã đúng, nhưng bạn có một nguồn cho điều đó không? – Guido

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