0

我正在将我们的一个构建中的操作系统从 Centos 5.3 32 位升级到 Centos 5.5 32 位。完成包更新后,我重新启动,检查源代码的干净副本,构建并运行单元测试。所有依赖于我们的 MemMap 基类的单元测试都开始失败。

当我们在映射内存后立即尝试设置保护页的值时,就会发生崩溃。在四处寻找之后,我能够将问题与我们使用 MAP_GROWSDOWN 标志隔离开来,没有它测试运行良好,但在设置标志时会崩溃。这些测试在构建系统运行 5.3 时运行良好,但当我们升级到 5.5 时立即开始崩溃。它们在我的开发机器上也能正常工作,它也运行 5.5,但它是真正的硬件;构建系统是 XEN VM。这是一段稳定的代码,在几个版本中都没有修改过,单元测试覆盖率超过 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
4

1 回答 1

2

看起来 MAP_GROWSDOWN 已从 glibc http://bugs.centos.org/view.php?id=4767中删除,不应使用。

于 2011-04-13T20:29:05.673 回答