2012-04-10 12 views
5

değerini döndürür Çalıştırmak için mmap işlevini alamıyorum. EINVAL hata kodunu döndürür.mmap(), EINVAL

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

benim platformu (Darwin) bu işlevin belgelerine kontrol ettim ve yanlış bir şey olacaksa görünmüyor. Mmap için man sayfası, EINVAL'in iade edileceği dört vaka sunar. Bu değil bu yüzden

[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 belirtilmemiştir. MAP_PRIVATE var: MAP_PRIVATE, MAP_PRIVATE (MAP_PRIVATE) var. Görüşme sırasında

[EINVAL]   The len argument was negative. 

len (map_size) argüman 8192.

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

ofset argüman (map_offset) 0 yüzden sayfa hizalanmış olmalıdır olmasıdır. (belki yanılıyor muyum?)

+1

MAP_ANON ile bazı uygulamalar fd'nin -1 olmasını gerektirir. Kontrol edilmeye değer olabilir. –

+0

** @ Simon Elliott ** Evet, haklısınız. Teşekkür ederim. –

cevap

2

İlk açıklamayı okuduğunuzdan emin misiniz? Bir kullanıcı süreci için

  1. MAP_FIXED belirtildi ve adr argüman sayfa hizalı değil,
  2. veya istenen adres alanının bir bölümü geçerli adres alanı dışına bulunduğu: Aynı zamanda iki ayrık durumlarda açıklayan olarak okunabilir .

Böyle okunursa, map_addr + slide ifadesinin gerçek değeri ilginç olur.

I (belirttiğiniz adres süreci adres alanı ile ilgili olarak ters gidebilir çünkü) ciddi bir sebebi var kadar mmaped bölgeyi yerleştirmek için addr argüman için NULL kullanarak ve Uygulama tam bir özgürlük vererek öneririm
0

değil Aksi halde yap.

+0

Bir test olarak, 'NULL' kullanmayı denedim. Hala "EINVAL" dönüyor. –

+0

@NickBrooks PAGE_SIZE'yi sisteminizde test edebilir misiniz? –