Как лучше всего выполнить предварительный сбой в стеке для потока pthreads?

Я пишу код для программы реального времени, работающей во встроенной системе Linux. Поскольку очень важно, чтобы мы не останавливались непредсказуемо из-за сбоев страниц, я хотел бы выполнить предварительный сбой в стеке, чтобы область, которую мы используем, гарантированно была покрыта вызовом mlockall () .

] Для основного потока это достаточно просто; просто выполните несколько больших alloca () и убедитесь, что выполняете запись каждые несколько страниц. Это работает, потому что при запуске программы предел стека намного больше, чем нам нужно; в конечном итоге мы выделяем именно то, сколько мы делаем до отказа.

Однако для стеков pthread они также будут распределяться с помощью MAP_GROWSDOWN ? Если да, то как лучше всего их забить, учитывая, что:

  1. Мы не не знаю, какая часть (известного) размера стека используется при запуске libc
  2. Мы не хотим выделять стеку больше памяти, чем необходимо

Я знаю, что могу использовать pthread_attr_setstack для передачи в стек, выделенный вручную, но это усложняет очистку после потока, и поэтому я бы предпочел избежать этого, если это возможно.

Как таковой, как лучше всего выполнить предварительную настройку? Было бы достаточно, если бы существовал простой способ узнать нижнюю границу стека (прямо над защитной страницей); на этом этапе я мог просто писать на каждую страницу оттуда до текущего указателя стека.

Обратите внимание, что переносимость не является проблемой; мы были бы счастливы получить решение, работающее только под x86-32 и Linux.

6
задан bdonlan 19 April 2011 в 19:34
поделиться