2012-04-10 4 views
5

Non riesco a ottenere la funzione mmap per funzionare. Restituisce il codice di errore EINVAL.mmap() restituisce EINVAL

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

Ho controllato la documentazione per questa funzione sulla mia piattaforma (Darwin) e non sembra essere nulla di male. La pagina man per mmap presenta quattro casi in cui EINVAL verrebbe restituito.

[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 non è specificato, quindi non è questo.

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

MAP_PRIVATE è presente.

[EINVAL]   The len argument was negative. 

Il len (map_size) tesi al momento della chiamata è 8192.

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

L'argomento offset (map_offset) è 0, quindi deve essere allineata pagina. (forse mi sbaglio?)

+1

Con MAP_ANON, alcune implementazioni richiedono che fd sia -1. Può valere la pena controllare. –

+0

** @ Simon Elliott ** Sì, hai ragione. Grazie. –

risposta

2

Sei sicuro della tua lettura della prima descrizione? Potrebbe anche essere letto come descrivere due casi disgiunti:

  1. MAP_FIXED stato specificato e l'argomento addr non era pagina allineati,
  2. o parte dello spazio indirizzo desiderato risiede fuori dello spazio indirizzo valido per un processo utente .

se letto in questo modo, il valore effettivo dell'espressione map_addr + slide diventa interessante.

0

Io suggerirei di usare NULL per l'argomento addr e dando l'attuazione la completa libertà di inserire il vostro regione mmaped (cos l'indirizzo specificato potrebbe andare a monte rispetto al processo di spazio di indirizzamento) fino a quando c'è un motivo serio per non fare diversamente

+0

Come test, ho provato a usare 'NULL'. Ancora restituendo 'EINVAL'. –

+0

@NickBrooks Puoi testare PAGE_SIZE sul tuo sistema? –