在使用许多SC_THREAD
进程(> 32000)的SystemC仿真的上下文中,我在运行Ubuntu 15.04的Intel X86平台上使用Accellera 2.3.1实现时遇到以下错误:
sc_cor_qt.cpp:114: virtual void sc_core::sc_cor_qt::stack_protect(bool)
Assertion `ret == 0' failed
SystemC内核的默认实现使用用户级线程(也称为协同程序)来实现SystemC进程。静态进程(SC_THREAD
和SC_CTHREAD
)在sc_simcontext.cpp
行中初始化759 thread_p->prepare_for_simulation()
此函数将创建用户级线程对象,然后启用堆栈保护。
用户级线程的堆栈在SystemC仿真过程的堆中通过以下行cor->m_stack = new char[cor->m_stack_size]
分配
我面临的问题发生在创建后的堆栈保护功能中,它使用mprotect
系统调用使页面紧跟用户级线程的堆栈之后(再次,在堆中 Linux 进程)根本无法访问(PROT_NONE
)。我ENOMEM
的错误(mprotect
)表示我们要保护的页面从未映射到内核无法分配内部结构的进程或在运行mprotect
电话时。不幸的是,我无法知道这两个错误中的哪一个发生以及如何解决它。
此外,在mprotect
调用之前,我无法看到在Linux进程堆中分配这个额外页面的位置。
有谁知道进一步调试此问题会发生什么和/或我能做些什么?
答案 0 :(得分:2)
问题是单个进程允许的最大内存映射数。每个mprotect
调用都会导致单个内存映射,从而导致映射的总数大于系统的默认限制。要增加此限制,必须使用:
sudo sysctl vm/max_map_count=524240
答案 1 :(得分:0)
听起来你的大部分存储应该在堆上,但是如果限制某些SC对象的分配,请尝试增加堆栈大小。
检查当前stacksize :(来自csh)
限制(或来自sh:ulimit -a)
如果还没有限制,请使用以下方法之一进行增加:
限制stacksize 1024m(来自sh:ulimit -s 1024000)
限制stacksize unlimited(来自sh:ulimit -s unlimited)