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