2010-10-29 153 views
0

我在CentOS 5.3 32bit到Centos 5.5 32bit之間升級操作系統。完成軟件包更新後,我重新啓動,檢出源代碼的乾淨副本,構建並運行單元測試。所有依賴MemMap基類的單元測試都開始失敗。爲什麼升級到Centos 5.5後MAP_GROWSDOWN會導致SIGBUS錯誤?

當我們嘗試在映射內存之後立即設置防護頁的值時發生崩潰。經過四處探查,我能夠將問題隔離到我們使用MAP_GROWSDOWN標誌,測試運行良好,但沒有它,但在設置標誌時崩潰。當構建系統運行5.3時,這些測試正常運行,但是當我們升級到5.5時立即崩潰。他們也在我的開發機器上運行良好,它也運行在5.5版本上,但是是真正的硬件;構建系統是一個XEN虛擬機。這是一段穩定的代碼,它在幾個版本中沒有被修改,並且單元測試覆蓋率在80%以上。

所以我想我的問題是爲什麼會發生這種情況?

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 
+1

如果你正在弄髒(並迫使映射)映射的底部,「MAP_GROWSDOWN」的目的是什麼? – ephemient 2010-10-30 04:34:14

回答

相關問題