# стратегия выделения стека - загадочные страницы

Тема в разделе "WASM.HEAP", создана пользователем kaspersky, 30 дек 2007.

  1. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    всем большое спасибо!
    сейчас сижу разбираю дампы, сравниваю разные системы и особенности их поведения. готовлю материал для статтьи, надеюсь толкнуть ее в osr.com с благодарностями всем участникам эксперимента!

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

    я не понял на счет "переда". если это область младших адресов, то тут все зависит от того, хватит ли обработчку остатка одной страницы или нет. если хватит, то все ок. если нет - то капец. если же имеется ввиду область старших адресов, то желтая страница автоматом снимет твой NO_ACCESS и ты получишь нулевой побочный эффект ;)

    я вот тут что раскопал.... и это тоже тянет на нету для статьи.
    возьмем функцию, возвращающую заранее непредсказуемый размер данных. например, gets, спрашивающую имя пользователя. fgets не предлагать, т.к. мы не может ограничить имя скажем 1000 символами, поскольку это не гумамнно. а вдруг у кого-то имя длиннее ;)
    ок. давайте делать так. давайте делать по умному. давайте делать virt_alloc с резервированием памяти, а потом по экскепшенам отслеживать сколько памяти реально нужно и выделять ее динамически на лету.

    а что если это поручить системе?! создаем поток со стеком в... несколько сот метров и путь система сама выделяет память по мере ее потребления. весь фокус в том, что если мы наложим на уже выделенную память vir_alloc, то система увеличит счетчики и при термировании потока эта память не будет освобождена!!! зато будет освобождены сотни метров зарезервированной памяти ;) как вам идея?
     
  2. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    kaspersky

    Мы друг друга немножко недопоняли...


    Вообще я тут натолкнулся на интересный антируткит Setup_Hypersight_RD_0_2_alpha.exe который мониторит WP бит кстати на сайте есть картинка http://www.northsecuritylabs.com/ и описание http://www.northsecuritylabs.com/downloads/press-release.pdf

    В основе лежит именно эта технология. Поскольку возможности сегментов естественно во flat модели МС не реализовала

    Плохая идея в плане производительности. К примеру если бы куча (heap) никому не была нужна, то зачем ее вообще придумали - выделение памяти равными кусками - обеспечивает наивысшую производительность + возможность использовать квоты и древовидную организацию. На исключение тратится слишком много процессорного времени (причем часть точно не на Irql = PASSIVE_LEVEL), кроме того терминация потока, а не процесса все равно приводит к вызову функций освобождения памяти.
     
  3. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    PROFi
    > Вообще я тут натолкнулся на интересный антируткит
    > Setup_Hypersight_RD_0_2_alpha.exe который мониторит WP бит
    который юзает дофига честных программ и кстати
    это не единственный способ записи в память ядра...

    > Плохая идея в плане производительности.
    > К примеру если бы куча (heap) никому не была нужна,
    а какие есть варианты? если функция возращает блок данных заранее неизвестного размера, то... что нам остается делать?!
    резервировать память, обрабатывая исключения вручную
    или все-таки поручить это дело системе? она уже точно
    сделает это не медленее, чем мы...
    а повторное выделение памяти - не такая уж и плохая идея.
    оно же работает на уровне страниц, а не блоков. допустим,
    ты выделил 100 метров памяти, после чего тебе остались
    нужны только несколько страниц в разных местах. ты можешь
    выделить их еще раз, а весь блок - освободить, тогда останутся
    только они...

    кстати, на счет произодительности.
    берем код вида
    f()
    {
    char buf[1024*1024];
    ....
    }

    и дизассемблируем его. видим функцию, вставленную компилятором, которая обращается к _каждой_ странице стека, чтобы быть уверенным, что page guard передвинута на нужную глубину. причем без фактического положения этой самой page_guard. т.е. если page_guard _уже_ отодвинута, скомпилированный код все равно обращается к каждой странице хотя бы один раз.

    решение: устанавливаем собственный обработчик исключений, выделяющий стековую память, когда она еще не выделена (и если надо, освобождающий ее когда ESP вновь опустился), а функцию проверки стека (у разных компилеров она называется по разному) заменяем "пустышкой".
    это дает _реальное_ и вполне ощутимое ускорение на программах, использующих локальные массивы из сотен кб и больше. (о том, что эта плохая практика юзать такие массивы мы сейчас не говорим).
     
  4. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    kaspersky
    Core2Duo E6600 WinXP SP2
     
  5. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    kaspersky

    Т.е. наподобие того как это происходит в 64 битных вызовах. Т.е. сразу резервируем стек максимального размера. Эта технология видимо уже оправдала себя и используется. Это понятно, и роль второго потока тоже ясна.

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

    Только вот есть один момент, с которым я столкнулся работая на "слабенькой машине" (в конечном итоге AVC видео воспроизводится рывками) (Piii-500 кстати лучшее железо для тестирования производительности - сразу ощущается) - обработка исключений весьма затратный процесс, если заранее выделить объем памяти v_alloc "промепить" ее чтением и в итоге производительность возрастает и весма значительно - меньше исключений - выше производительность. Потому по возможности лучше вообще исключений избегать. Но это в до-многоядерную эпоху, потому твое предложение с учетом современной многоядерности имеет смысл.

    Кстати имеено из-за времени обрабоки прехода между кольцами 3 и 0 правильно настроенная Windows XP оказывается быстрее 2000 - а причина лишь одна инструкция - sysenter :).

    Потому заявления о скорости и т.п. должны быть подкреплены PoC (proof-of-concept) (я так полагаю суммарно rdtsc на каждом ядре не на HT машинах пойдет).


    - только эта тузла еще мониторит использование страниц, и соответственно и атрибутов последних. С одной стороны затратно, но тузла работает в режиме гипервизора. И с варей не дружит, в смысле если установлена на хосте.
     
  6. v2

    v2 New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    1
    Core2Duo T7250 W2k3 Ent SP2 DEP on
     
  7. mz_

    mz_ New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    9
    Может еще надо =)

    CoreDuoT2050-WinXPSP2.txt
    CoreQuadQ6600-WinXPSP2.txt
    CoreQuadQ6600-Vista_VMware_box.txt
    CoreQuadQ6600-Vista.txt

    В висте программулина ведет себя несколько странно (и в вирт, и на реал машине) - несколько раз подряд вылетала на 00%, но если начинала работать, то до конца (надеюсь что победного)
     
  8. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    core2 quad Q6600, WinXP+SP2
     
  9. Guest

    Guest Guest

    Публикаций:
    0
    На VMWare под XP x64 не заработало.