2014-07-03 11 views
6

Qualcuno sa perché mmap() restituisce MAP_FAILED invece di NULL? Sembra che MAP_FAILED sia (void *) - 1 sulla maggior parte dei sistemi. Perché mmap() non usa invece NULL? So che l'indirizzo 0x0 è tecnicamente una pagina di memoria valida, mentre (void *) - 1 non sarà mai una pagina valida. Eppure la mia ipotesi è che mmap() in realtà non restituirà mai la pagina 0x0. Su Windows, ad esempio, VirtualAlloc() restituisce NULL in caso di errore.Perché mmap() usa MAP_FAILED invece di NULL?

È sicuro assumere che mmap() non restituirà mai 0x0? Presumibilmente una chiamata riuscita a mmap() dovrebbe restituire memoria utilizzabile al chiamante. L'indirizzo 0x0 non è mai utilizzabile, quindi non dovrebbe mai essere restituito in caso di successo. Tale circostanza renderebbe ragionevole utilizzare 0x0 come errore-sentinella, motivo per cui sono perplesso dall'esistenza di MAP_FAILED in primo luogo.

risposta

6

Ci sono alcune rare situazioni in cui mmap() creerà effettivamente una mappatura all'indirizzo 0x0. In questi giorni, in genere richiede i privilegi di root (o per la sysctl mmap_min_addr da impostare su zero sui sistemi Linux) ma è possibile. Se viene creata tale mappatura, diventa possibile scrivere a questo indirizzo.

MAP_FAILED, d'altra parte, non è mai un valore di ritorno valido da mmap(), quindi è utilizzabile come sentinella.

+0

Questo è molto interessante su mmap_min_addr. Quindi sembra che in alcuni casi sia possibile richiedere una mappatura all'indirizzo 0x0. Detto questo, permettimi di dare più specificità alla mia domanda. Ho chiesto se mmap() restituirà NULL in pratica, ma cosa volevo davvero chiedere se una chiamata MAP_ANON come mmap (NULL, dimensione, flag, MAP_ANON | MAP_PRIVATE, -1, 0) tornerà o meno? nulla in pratica Questo è il mio caso d'uso reale, quindi è quello che sono davvero curioso di sapere. –

+1

No, 'mmap()' non restituirà mai una mappatura a quell'indirizzo a meno che non lo si chieda con 'MAP_FIXED'. – duskwuff

+0

@duskwuff Sono abbastanza sicuro che tu abbia ragione, ma hai una fonte per questo? – Guido