В контексте моделирования SystemC со многими процессами SC_THREAD
(> 32000) я столкнулся со следующей ошибкой с реализацией Accellera 2.3.1 на платформе Intel X86 под управлением Ubuntu 15.04:
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 strong> процесс) вообще недоступен (PROT_NONE
). Ошибка (ENOMEM
), которую я получил от mprotect
, говорит о том, что эта страница, которую мы хотим защитить, никогда не отображалась в процесс или, что ядро не смогло выделить некоторые внутренние структуры во время выполнения вызова mprotect
. К сожалению, я не могу знать, какая из этих двух ошибок происходит и как ее исправить.
Более того, я не вижу, где эта лишняя страница выделяется в куче линуксового процесса до того, как будет сделан вызов mprotect
.
Кто-нибудь знает, что происходит и/или что я могу знать для дальнейшего отладки этой проблемы?