Я пишу код для программы реального времени, работающей во встроенной системе Linux. Поскольку очень важно, чтобы мы не останавливались непредсказуемо из-за сбоев страниц, я хотел бы выполнить предварительный сбой в стеке, чтобы область, которую мы используем, гарантированно была покрыта вызовом mlockall ()
.
] Для основного потока это достаточно просто; просто выполните несколько больших alloca ()
и убедитесь, что выполняете запись каждые несколько страниц. Это работает, потому что при запуске программы предел стека намного больше, чем нам нужно; в конечном итоге мы выделяем именно то, сколько мы делаем до отказа.
Однако для стеков pthread они также будут распределяться с помощью MAP_GROWSDOWN
? Если да, то как лучше всего их забить, учитывая, что:
Я знаю, что могу использовать pthread_attr_setstack
для передачи в стек, выделенный вручную, но это усложняет очистку после потока, и поэтому я бы предпочел избежать этого, если это возможно.
Как таковой, как лучше всего выполнить предварительную настройку? Было бы достаточно, если бы существовал простой способ узнать нижнюю границу стека (прямо над защитной страницей); на этом этапе я мог просто писать на каждую страницу оттуда до текущего указателя стека.
Обратите внимание, что переносимость не является проблемой; мы были бы счастливы получить решение, работающее только под x86-32 и Linux.