从_chkstk说起,谈谈用户栈的管理

上周在XP系统上测试一个驱动的时候,发现驱动加载不上,“net start”命令只是给出一个无意义的错误代码,驱动的DriverEntry()入口程序还没有得到机会运行。

初步怀疑是引入函数的问题,用WDK工具Depends.exe查看了一下驱动文件,果然是由于_chkstk函数无法解析所导致。

_chkstk是个微软C编译器的辅助库函数,MSDN上对其介绍十分简略:

_chkstk Routine is a helper routine for the C compiler. For x86 compilers, _chkstk Routine is called when the local variables exceed 4096 bytes; for x64 compilers it is 8K.

当编译器察觉到局部变量太大超过限值时(X86系统限值是4K,X64t系统上是8K), 编译器会自动插入_chkstk这个函数以保证栈空间所使用页面在内存中。

问题是发现了,但要查出来究竟在哪个函数中还是要费些心思的。从用户层移植过来不少代码,基本锁定问题出在其中,但如果一个函数一个函数寻找实在是个不讨巧的笨办法,也不符合程序人的一贯风格,便用IDA反编译驱动sys文件,于汇编代码中搜索_chkstk字串,直接锁定出了问题函数。此函数所使用的一个结构体中定义了超大数组,对栈的超常使用在内核中是相当危险的。

解决办法很简单,直接将此结构的定义放在一个从内存分配的结构中即可。问题虽已解决,但对于DDK中有关_chkstk的描述,及其相关的疑问一直让我觉得困扰,比如,为什么X86上是4K,而AMD64架构上可以是8K。

这两天终于有了时间,可以彻底地了结这个疑问了。

要想解决这个问题,还要先从用户栈的分配开始。以ReactOS代码为例,当线程创建时,CreateThread()会调用BasepCreateStack()来创建用户栈,具体可以参见ReactOS源码:
~/ReactOS/lib/kernel32/misc/utils.c。

BasepCreateStack()函数主要做三件事:

  1. 1,分配栈空间所需的虚拟内存,大小为Stack Reserve Size
  2. 2,根据Stack Commit Size锁定内存页面,如果Stack Commit Size小于Stack Reserve Size的话,需要增加一个Page,这个额外申请的Page用作Guard Page之用。
  3. 3,将栈底部的Page设定为Guard Page。

当用户栈被用尽时,会访问到栈底部的Guard Page。而对Guard Page的任何访问都会导致Page Fault的发生。Page Fault处理函数MmAccessFault()可以分析出此次Page Fault是由Guard Page导致,便会默认由用户栈处理程序MiCheckForUserStackOverflow()来处理。如果用户栈并没有溢出的话,即Stack Commit Size小于Stack Reserve Size的情况,MiCheckForUserStackOverflow()会自动向下扩展栈空间,扩展大小为GUARD_PAGE_SIZE。 GUARD_PAGE_SIZE针对不同的CPU架构有不同的定义:
X64:  #define GUARD_PAGE_SIZE   (PAGE_SIZE * 2)
X86:  #define GUARD_PAGE_SIZE   PAGE_SIZE

这里便解释了为什么X86系统上的限制是4K(即PAGE_SIZE),而X64上却为8K的原因。

说到此处,该是解答_chkstk()倒底是干什么的时候了。Visual Studio中有_chkstk的源码,以x86为例:

输入参数eax是所需堆栈大小(字节)
labelP  _chkstk,       PUBLIC

        push    ecx                          ; save ecx
        cmp     eax,_PAGESIZE_     ; more than one page requested?
        lea     ecx,[esp] + 8           ;   compute new stack pointer in ecx
                                                   ;   correct for return address and
                                                   ;   saved ecx
        jb      short lastpage           ; no

;------------

probepages:
        sub     ecx,_PAGESIZE_          ; yes, move down a page
        sub     eax,_PAGESIZE_          ; adjust request and...

        test    dword ptr [ecx],eax     ; ...probe it  (如果是guard page,刚会导致page fault,最终用户栈
                                                        ;  将向下扩展一个页面)

        cmp     eax,_PAGESIZE_          ; more than one page requested?
        jae     short probepages          ; no

lastpage:
        sub     ecx,eax                  ; move stack down by eax
        mov     eax,esp                 ; save current tos and do a...

        test    dword ptr [ecx],eax     ; ...probe in case a page was crossed
                                                        ;  调用函数将要访问的堆栈底部 ,如果此页面为guard page,同
                                                        ;  样会导致用户栈的向下延伸

        mov     esp,ecx                        ; set the new stack pointer
                                                        ; 向下更改栈指针,其上直到原ESP的栈空间为调用函数局部变量

        mov     ecx,dword ptr [eax]     ; recover ecx
        mov     eax,dword ptr [eax + 4] ; recover return address
                                                            ; 将返回地址(调用函数中)放入eax

        push    eax                     ; prepare return address
                                              ; 将返回地址(调用函数中)放入当前栈中,准备返回

                                              ; ...probe in case a page was crossed
        ret

        end

_chkstk()的主要作用是保证栈向下连续的生长。如果没有_chkstk(),当局部变量太多并超过guard page下沿时,若再有压栈操作,将会导致Access violation错误。因为此时堆栈内存页面无效,压栈直接将导致page fault的发生,而page fault处理程序因不能识别此fault的发生原因从而不能做出正确判断和有效处理。

相对用户层,内核程序的处理则相当简单,就如Win7内核中_chkstk实际上就是个空函数。其原因就是内核线程的栈空间是固定的。其取值针对X86及X64架构亦有所不同:
X64: #define KERNEL_STACK_SIZE 0x6000   /* 6个内存页面 */
X86: #define KERNEL_STACK_SIZE 12288    /* 3个内存页面 */

内核中栈资源非常紧缺,并驱动程序的编写有较高的要求,特别是有递归的情况下,一定要注意嵌套的层数,否则很容易收到M$发来的蓝屏。

Windows内核中其实还有一种大堆栈机制,以确保一些对堆栈较高消耗的特殊情况能够得到满足,但这部分完全是黑箱,对用户不可见,不是常见情况,此处不再多述。

参考资料:
1, http://support.microsoft.com/kb/100775/en
2, http://msdn.microsoft.com/en-us/library/ms648426(v=vs.85).aspx
3, http://www.reactos.org  ReactOS源码

15,541 条评论

  1. Recognized portal Pixel Diary FAQ keeps documentation lean and useful. Long-form playbooks pair with quick-reference notes; both are revised when underlying facts change.

  2. Hi just wanted to give you a brief heads up and let you know a few of the pictures aren’t loading properly. I’m not sure why but I think its a linking issue. I’ve tried it in two different web browsers and both show the same results.
    Idol Pop Fever

  3. Медицинский процесс в клинике проводится поэтапно, что позволяет стабилизировать состояние пациента и избежать резких нагрузок на организм.
    Получить больше информации – вывод из запоя клиника тверь

  4. Уже при первичном звонке мы собираем ключевую информацию: длительность употребления, типы веществ, сопутствующие заболевания, прошлые реакции на лекарства, эпизоды судорог и психозов, недавние значения АД/ЧСС. Это позволяет подготовить персональный стартовый протокол ещё до визита: поставить цель на первые 72 часа, определить метрики (сон, «тяга», дневная энергия), запланировать вечерний ритуал и расписать дистанционные чек-ины. Прозрачность шагов снижает тревогу у пациента и семьи и повышает соблюдаемость — фундамент устойчивого результата.
    Получить дополнительные сведения – вывод наркологическая клиника в каменске-уральске

  5. Публикация приглашает вас исследовать неизведанное — от древних тайн до современных достижений науки. Вы узнаете, как случайные находки превращались в революции, а смелые мысли — в новые эры человеческого прогресса.
    Информация доступна здесь – вывод из запоя цена на дому

  6. В этой статье рассматриваются актуальные вопросы, связанные с развитием медицинской науки и её внедрением в повседневную практику. Особое внимание уделено вопросам профилактики, ранней диагностики и использованию технологий для улучшения здоровья человека.
    Обратитесь за информацией – кодирование от алкоголизма стационар

  7. Непрерывный мониторинг витальных показателей — ключевое отличие стационарного формата, обеспечивающее безопасную детоксикацию. В палатах клиники «Элегия Мед» установлены системы отслеживания частоты пульса, сатурации, температуры и артериального давления, данные с которых автоматически передаются в электронную медицинскую карту. Медицинский персонал дежурит круглосуточно, что обеспечивает мгновенную реакцию на ухудшение состояния: коррекцию инфузионной терапии, введение симптоматических препаратов, привлечение смежных специалистов при необходимости. Такая организация процесса исключает хаотичное назначение средств, предотвращает полипрагмазию и гарантирует, что каждый этап детоксикации проходит под строгим клиническим контролем. При необходимости применяются дополнительные методы очищения крови, включая плазмаферез, который эффективно помогает вывести стойкие токсины и метаболиты, не удаляемые стандартной инфузионной терапией.
    Изучить вопрос глубже – вывод из запоя в стационаре санкт-петербург

  8. Hey! I know this is kinda off topic but I was wondering which blog platform are you using for this website? I’m getting tired of WordPress because I’ve had problems with hackers and I’m looking at options for another platform. I would be fantastic if you could point me in the direction of a good platform.

  9. Тактика подбирается индивидуально и зависит от тяжести состояния, сопутствующих заболеваний и переносимости препаратов. Ниже представлены базовые компоненты, которые часто включаются в схемы лечения при запойных состояниях.
    Изучить вопрос глубже – вывод из запоя на дому недорого переулок панфилова, 36

  10. Терапевтический процесс в стационаре строится по принципу последовательного выполнения клинических задач: диагностика, стабилизация, медикаментозная поддержка и подготовка к амбулаторному этапу. При поступлении врач проводит детальный осмотр, собирает анамнез, оценивает неврологический статус и при необходимости назначает лабораторные исследования. На основе полученных данных формируется индивидуальный протокол, учитывающий возраст, длительность интоксикации, наличие сопутствующих патологий и переносимость лекарственных компонентов. Мы применяем только сертифицированные препараты, зарегистрированные в РФ, и строго соблюдаем клинические рекомендации Минздрава, исключая псевдонаучные методики.
    Подробнее – нарколог вывод из запоя в стационаре

  11. Непрерывный мониторинг витальных показателей — ключевое отличие стационарного формата. В палатах клиники «Элегия Мед» установлены системы отслеживания частоты пульса, сатурации, температуры и артериального давления, данные с которых автоматически передаются в электронную медицинскую карту. Медицинский персонал дежурит круглосуточно, что обеспечивает мгновенную реакцию на ухудшение состояния: коррекцию инфузионной терапии, введение симптоматических препаратов, привлечение смежных специалистов при необходимости. Такая организация процесса исключает хаотичное назначение средств, предотвращает полипрагмазию и гарантирует, что каждый этап детоксикации проходит под строгим клиническим контролем. Контроль состояния пациента в режиме реального времени позволяет врачам оперативно корректировать терапию и минимизировать риски для здоровья.
    Подробнее можно узнать тут – https://vyvod-iz-zapoya-v-staczionare-sankt-peterburg-20.ru

  12. Resource centre Bidsignal FAQ consolidates the questions buyers ask most often, with answers drawn from comment-section feedback over the past quarter.

  13. Первый этап вывода из запоя на дому – это первичная оценка состояния пациента. Врач, прибывший на вызов, осматривает пациента, проверяет уровень алкоголя в крови, измеряет артериальное давление, пульс и температуру. Это необходимо для того, чтобы определить степень алкогольной интоксикации и выбрать правильную тактику лечения.
    Ознакомиться с деталями – вывод из запоя на дому цена в екатеринбурге

  14. Запой – это состояние, при котором человек продолжает употреблять алкоголь в течение длительного времени, не в состоянии прекратить употребление самостоятельно, что является проявлением алкоголизма. Это может привести к серьезным проблемам со здоровьем, и в таком случае необходим вывод из запоя с помощью наркологической помощи, при этом в дальнейшем может рассматриваться кодирование.
    Подробнее – анонимный вывод из запоя на дому в екатеринбурге

  15. В этом обзорном материале представлены увлекательные детали, которые находят отражение в различных аспектах жизни. Мы исследуем непонятные и интересные моменты, позволяя читателю увидеть картину целиком. Погрузитесь в мир знаний и удивительных открытий!
    Углубить понимание вопроса – нарколог на дом цены

  16. Такая последовательность шагов позволяет врачу действовать точно и эффективно. Благодаря комплексному подходу пациент чувствует облегчение уже через 1–2 часа после начала терапии, а полное восстановление наступает в течение суток.
    Подробнее тут – анонимный вывод из запоя

  17. Даже при умеренной симптоматике самостоятельные попытки «перетерпеть» часто приводят к усугублению дегидратации, электролитным нарушениям и риску делирия. Медицинский контроль позволяет корректировать состояние по объективным показателям и предотвращать декомпенсацию.
    Узнать больше – https://vyvod-iz-zapoya-doneczk0.ru

  18. В клинике применяются только доказательные методы, эффективность которых подтверждена практикой. Медицинское и психологическое воздействие дополняют друг друга, формируя комплексный эффект.
    Подробнее можно узнать тут – http://narkologicheskaya-klinika-v-tveri0.ru

  19. Процесс вывода из запоя на дому с выездом врача в Екатеринбурге включает несколько этапов, начиная с первичного осмотра пациента и заканчивая корректировкой лечения в зависимости от его состояния. Врач-нарколог проводит полный осмотр, анализирует симптомы и составляет план лечения, который включает детоксикацию организма, поддерживающую терапию и медикаментозное лечение для снятия симптомов абстиненции.
    Разобраться лучше – http://vyvod-iz-zapoya-na-domu-ekaterinburg-16.ru/

  20. Вывод из запоя направлен не только на снятие острых симптомов, но и на комплексное восстановление организма. Работа специалистов позволяет стабилизировать состояние и создать условия для дальнейшего лечения зависимости.
    Исследовать вопрос подробнее – срочный вывод из запоя

  21. Этот текст призван помочь читателю расширить кругозор и получить практические знания. Мы используем простой язык, наглядные примеры и структурированное изложение, чтобы сделать обучение максимально эффективным и увлекательным.
    Открой скрытое – наркологическая помощь на дому москва

  22. Непрерывный мониторинг витальных показателей — ключевое отличие стационарного формата, обеспечивающее безопасную детоксикацию. В палатах клиники «Элегия Мед» установлены системы отслеживания частоты пульса, сатурации, температуры и артериального давления, данные с которых автоматически передаются в электронную медицинскую карту. Медицинский персонал дежурит круглосуточно, что обеспечивает мгновенную реакцию на ухудшение состояния: коррекцию инфузионной терапии, введение симптоматических препаратов, привлечение смежных специалистов при необходимости. Такая организация процесса исключает хаотичное назначение средств, предотвращает полипрагмазию и гарантирует, что каждый этап детоксикации проходит под строгим клиническим контролем. При необходимости применяются дополнительные методы очищения крови, включая плазмаферез, который эффективно помогает вывести стойкие токсины и метаболиты, не удаляемые стандартной инфузионной терапией.
    Узнать больше – https://vyvod-iz-zapoya-v-staczionare-sankt-peterburg-18.ru/

  23. В Каменске-Уральском бригада «Трезвый Урал» ориентируется на прибытие в согласованное окно — обычно это ближайшие 60–90 минут с момента звонка при наличии свободной бригады. Координатор уточняет особенности подъезда, желаемую конфиденциальность (немаркированный автомобиль, отсутствие форменного халата), базовые медицинские данные (аллергии, хронические болезни, постоянные препараты, эпизоды судорог или психозов в прошлом) и бытовые условия (возможность обеспечить тишину, доступ к питьевой воде, удлинитель). После приезда врач проводит осмотр, экспресс-оценку состояния, измеряет АД, ЧСС, сатурацию, температуру, при необходимости выполняет экспресс-тесты и состав инфузии адаптирует под текущее самочувствие.
    Детальнее – анонимный вывод из запоя каменск-уральск

  24. Совместное банкротство супругов — законный способ списать долги семьи через одну процедуру. Переходите по запросу юридическая помощь по семейному банкротству. Поможем подготовить документы, учесть общее имущество, защитить ваши интересы в суде и пройти процедуру с минимальными рисками. Консультация юриста — первый шаг к финансовому освобождению.

  25. Мы заранее объясняем, какие шаги последуют, чтобы пациент и близкие понимали логику вмешательств и не тревожились по поводу непредвиденных «сюрпризов». Карта ниже — ориентир; конкретные параметры врач уточнит после осмотра.
    Получить больше информации – https://vyvod-iz-zapoya-pervouralsk0.ru/vyvod-iz-zapoya-na-domu-pervouralsk/

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注