gpt4 book ai didi

c++ - 带有大量 SC_THREAD 的 Accellera SystemC 错误

转载 作者:行者123 更新时间:2023-11-30 03:43:30 31 4
gpt4 key购买 nike

在具有许多 SC_THREAD 进程(> 32000)的 SystemC 模拟环境中,我在运行 Ubuntu 15.04 的英特尔 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_THREADSC_CTHREAD)在 sc_simcontext.cpp 行 759 thread_p->prepare_for_simulation() 中初始化> 此函数将创建用户级线程对象,然后启用堆栈保护。

用户级线程的栈通过下面一行cor->m_stack = new char[cor->m_stack_size]

在SystemC模拟进程的堆中分配

我面临的问题发生在创建后的堆栈保护函数中,它使用 mprotect 系统调用使页面紧跟在用户级线程的堆栈之后(同样,处于Linux 进程的堆)根本无法访问(PROT_NONE)。我从 mprotect 得到的错误 (ENOMEM) 说我们要保护的这个页面从未映射到进程内核是运行 mprotect 调用时无法分配一些内部结构。不幸的是,我无法知道发生了这两个错误中的哪一个以及如何解决它。

此外,在调用 mprotect 之前,我看不到在 Linux 进程的堆中分配这个额外页面的位置。

有谁知道发生了什么和/或我能做些什么来进一步调试这个问题?

最佳答案

问题是单个进程允许的最大内存映射数。每个 mprotect 调用都会导致单个内存映射,从而导致映射总数大于系统的默认限制。要增加此限制,必须使用:

sudo sysctl vm/max_map_count=524240

关于c++ - 带有大量 SC_THREAD 的 Accellera SystemC 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36032419/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com