2012-04-10 27 views
5

Tôi không thể sử dụng chức năng mmap để hoạt động. Nó trả về mã lỗi EINVAL.mmap() trả về EINVAL

void* mapped = 
     mmap((void*)(map_addr + slide), 
      map_size, 
      PROT_WRITE | PROT_READ, 
      MAP_PRIVATE | MAP_ANON, 
      bprm->file, 
      map_offset); 

Tôi đã kiểm tra các tài liệu cho chức năng này trên nền tảng của tôi (Darwin) và có vẻ không phải là điều gì sai trái. Trang người đàn ông cho mmap trình bày bốn trường hợp theo đó EINVAL sẽ được trả về.

[EINVAL]   MAP_FIXED was specified and the addr argument was not page 
        aligned, or part of the desired address space resides out of the 
        valid address space for a user process. 

MAP_FIXED không được chỉ định nên không phải vậy.

[EINVAL]   flags does not include either MAP_PRIVATE or MAP_SHARED. 

MAP_PRIVATE hiện diện.

[EINVAL]   The len argument was negative. 

Các len (map_size) lập luận vào thời điểm cuộc gọi là 8192.

[EINVAL]   The offset argument was not page-aligned based on the page size as 
        returned by getpagesize(3). 

Đối số bù đắp (map_offset) là 0 vì vậy nó phải được trang liên kết. (có thể tôi sai?)

+1

Với MAP_ANON, một số triển khai yêu cầu fd phải bằng -1. Có thể đáng để kiểm tra. –

+0

** @ Simon Elliott ** Vâng, bạn nói đúng. Cảm ơn bạn. –

Trả lời

2

Bạn có chắc chắn về việc đọc mô tả đầu tiên không? Nó cũng có thể được đọc như mô tả hai trường hợp rời nhau:

  1. MAP_FIXED đã được chỉ định và lập luận addr là không trang liên kết,
  2. hoặc một phần của không gian địa chỉ mong muốn cư trú ra khỏi không gian địa chỉ hợp lệ cho một quá trình sử dụng .

nếu đọc như thế này, giá trị thực tế của biểu thức map_addr + slide trở nên thú vị.

0

Tôi khuyên bạn nên sử dụng NULL cho đối số addr và thực hiện tự do hoàn toàn để đặt khu vực mmaped của bạn (địa chỉ mà bạn chỉ định có thể bị xáo trộn liên quan đến không gian địa chỉ) cho đến khi có lý do nghiêm trọng làm khác đi.

+0

Là một thử nghiệm, tôi đã thử sử dụng 'NULL'. Vẫn đang quay lại 'EINVAL'. –

+0

@NickBrooks Bạn có thể kiểm tra PAGE_SIZE trên hệ thống của mình không? –