Domanda

Mi è stato l'aggiornamento del sistema operativo su uno dei nostri accumulo da CentOS 5.3 a 32 bit a CentOS 5.5 a 32 bit. Dopo aver fatto l'aggiornamento del pacchetto ho riavviato, controllato una copia pulita della fonte, costruito e corse i test di unità. Tutti i test di unità che si basano sulla nostra classe base memmap hanno cominciato a fallire.

L'arresto si verifica quando si cerca di impostare il valore della pagina di guardia dopo subito dopo la mappatura della memoria. Dopo aver frugato ero in grado di isolare il problema al nostro uso della bandiera MAP_GROWSDOWN, i test eseguiti bene anche senza, ma in crash quando il flag è impostato. Questi test hanno lavorato bene quando il sistema di generazione è in esecuzione 5.3, ma subito ha iniziato crash quando abbiamo aggiornato a 5.5. Funzionano bene anche sulla mia macchina di sviluppo che è in corso anche 5.5, ma è reale l'hardware; il sistema di compilazione è un XEN VM. Questo è un po 'stabile di codice che non è stata modificata in varie versioni e ha unità di copertura di test a nord del 80%.

Quindi credo che la mia domanda è perché sta succedendo questo?

int flags = MAP_ANONYMOUS|MAP_PRIVATE|MAP_GROWSDOWN;
int prot = PROT_EXEC|PROT_READ|PROT_WRITE;
size_t length = 524288;

long rv = ::sysconf(_SC_PAGESIZE);
if (rv < 0)
    throw SystemException(errno);
size_t pagelength = size_t(rv);

//  Adjust length for guard page
length = pagelength * (((length + pagelength - 1) / pagelength) + 1);

m_addr = ::mmap(NULL, length, prot, flags, -1, 0);
if (m_addr == MAP_FAILED)
    throw SystemException(errno);

m_stackaddr = static_cast<void *>(static_cast<char *>(m_addr) + pagelength);
m_length = length - pagelength;

// Fill the guard page with an interesting pattern
unsigned int *g = static_cast<unsigned int *>(m_addr);
for (size_t i=0; i < pagelength; i += sizeof(unsigned int))
    *g++ = 0xBADC0FFEU;  <-- SIGBUS HAPPENS HERE ON FIRST ITERATION
È stato utile?

Soluzione

Sembra che MAP_GROWSDOWN è stato rimosso dal glibc http://bugs.centos.org /view.php?id=4767 e non dovrebbe essere usato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top