Расширение стека

Тема в разделе "WASM.WIN32", создана пользователем Jin X, 24 апр 2019.

  1. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Привет всем!

    Кто-нибудь знает, где можно почитать про динамическое расширение стека? Чё-т не могу нагуглить толком. Есть какие-то обрывки с форумов, а так, чтоб обстоятельно и подробно – не нахожу.

    Вот здесь более или менее что-то нарыл: http://caslab.csl.yale.edu/workshops/hasp2016/HASP16-17.pdf (пп. 5.2, 6.3). Но здесь общие сведения о технологии, а не конкретные реализации в Windows/Linux.

    Интересуют подробности механизма именно в Windows и в Linux (как минимум знаю, что в Windows надо откусывать по 4 Кб, в Linux такого, как я понял, нет). Может ли стек "сжиматься" обратно при каких-либо обстоятельствах (мало ли)? И т.д.
     
    q2e74 нравится это.
  2. q2e74

    q2e74 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    999
    Что-то размер подозрительно совпадает с размером страницы. А что значит "сжимается"? Граница секции двигается?
     
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Механизм расширения стека довольно не прост, у меня к примеру недавно была та же задача - мониторить расшрение стека для апдейта карты памяти.

    Смотри реализацию в wrk: MiCheckForUserStackOverflow(). Используется несколько полей TEB, deallocation к примеру.

    Если не нужна какая то спец обработка, то трогать стек не нужно. А есчо стек проверяется защитой.
     
    Jin X нравится это.
  4. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Логично :)
    То и значит. Было выделено 32 Кб, допустим, растянули до 1 Мб, дальше используется в пределах 32 Кб. Может ли освободиться память между 32 Кб и 1 Мб, т.е. вернуться в исходное состояние всё?

    Что значит не нужно трогать? Маркитанить я тут не собираюсь, просто хочу механизм понять.
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Jin X,

    > Что значит не нужно трогать?

    Стек по умолчанию расширяется вниз при доступе к сторожевой его странице на одну страницу. Есть некоторые параметры, изменение которых изменит сам механизм, посмотрите выше в функции:
    Код (Text):
    1.         RegionSize = (SIZE_T) Teb->GuaranteedStackBytes;
    2. ...
    3.     if (RegionSize != 0) {
    4.         RegionSize += PAGE_SIZE;
    5.         MaximumAddress = (PVOID) ((PCHAR) DeallocationStack - PAGE_SIZE);
    6.     }
    7.  
    8.     if (RegionSize < GUARD_PAGE_SIZE) {
    9.         RegionSize = GUARD_PAGE_SIZE;
    10.     }
    11.  
    Стек расширяется так же при выборке из ядра в него.

    > Может ли освободиться память между 32 Кб и 1 Мб

    Не может. Есть в нт такое понятие как фиберы https://docs.microsoft.com/en-us/windows/desktop/procthread/fibers
    Каждый фибер имеет свой стек, он переключается при переключении на фибер.
    --- Сообщение объединено, 25 апр 2019 ---
    Кстате есть с фиберами один подводный камень". Удобно использовть вершину стека для хранения указателя на локальное хранилище, так как там свободное поле. Но если например вызвать диалог выбора файла, окажется что поле зануляется. На самом деле это переключается стек при использовании фиберов :)
     
    Jin X нравится это.
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Есть такая штука - резервирование памяти, по английски allocate. См VirtualAlloc Вы указываете сколько страниц вам надо. Но физически они не выделяются. Когла проц обращается к стеку срабатывает исключение защиты страниц. И виндоус выделяет страницу.

    Ах да расширение работает только для последовательного выделении памяти.

    В линуксе аналогично но там обработку исклучения надо делать ручками.

    Высвобождение может происходить. По таймеру в мониторе производительности сжатие страниц. Но неясно как оно работает.
     
    Jin X нравится это.
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Pavia,

    > Высвобождение может происходить. По таймеру в мониторе производительности сжатие страниц.

    Это теневая работа ядра ос. В нт тоже есть часть, которая выгружает рабочие наборы. Но про эти механизмы поток не знает и ему незачем.
     
    Jin X нравится это.