2010-05-01 24 views
8

Sono confuso dallo specification of mmap.allineamento e granularità di mmap

Sia pa tramite l'indirizzo di ritorno della mmap (la stessa della specificazione)

pa = mmap (addr, len, prot, bandiere, fildes, spento);

A mio parere, dopo la chiamata di funzione successo la seguente gamma è valido

[pa, pa + len)

La mia domanda è se la gamma dei seguenti è ancora valido?

[round_down (pa, pagesize), round_up (pa + len, pagesize))
[base, base + size] per breve

Vale a dire:

  1. è il base sempre allineato sul limite della pagina?
  2. è il size sempre un multiplo di pagine (la granularità è pagine in altre parole)?

Grazie per il vostro aiuto.

penso che è implicito in questo paragrafo:

L'argomento off è vincolato ad essere allineati e dimensionata in base al valore restituito da sysconf() quando passa _SC_PAGESIZE o _SC_PAGE_SIZE. Quando viene specificato MAP_FIXED, l'applicazione deve garantire che l'argomento addr soddisfi anche questi vincoli. L'implementazione esegue operazioni di mappatura su pagine intere. Pertanto, mentre l'argomento len non deve soddisfare un vincolo di dimensione o di allineamento, l'implementazione deve includere, in qualsiasi operazione di mappatura, qualsiasi pagina parziale specificata dall'intervallo [pa, pa + len).

Ma non sono sicuro e non ho molta esperienza su POSIX.

  • Vi prego di mostrare un po 'più esplicito e più definitiva prove
  • O mi mostrano almeno un sistema che supporta POSIX ed ha un comportamento diverso

Grazie ancora qua.

risposta

3

La tua domanda è abbastanza aperta, considerando che mmap ha molte diverse modalità e configurazioni, ma cercherò di coprire i punti più importanti.

Prendere il caso in cui si sta mappando un file in memoria. L'inizio dei dati nel file sarà sempre radicato all'indirizzo di ritorno di mmap(). Mentre il sistema operativo potrebbe aver effettivamente creato mappe ai limiti della pagina, non credo che lo standard POSIX richieda che il sistema operativo faccia in modo che questa memoria sia scrivibile (ad esempio potrebbe forzare i segfault su queste regioni se lo desidera). Nel caso dei file di mappatura non ha senso che questa regione di indirizzo di memoria aggiuntiva sia supportata da un file, che ha più senso per queste regioni non definite.

Per MMAP_ANONYMOUS, tuttavia, è probabile che la memoria sia scrivibile, ma, ancora, non sarebbe saggio utilizzare questa memoria.

Inoltre, quando si utilizza mmap() si sta effettivamente utilizzando la versione di mmap() di glibc, e può affettare e azzerare la memoria in qualsiasi modo lo ritenga opportuno. Infine, vale la pena notare che su OSX, che è conforme a POSIX, nessuno dei testi citati presentati appare nella pagina man per mmap().