从_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源码

26,537 条评论

  1. Слушайте кто знает Брат снова сорвался Соседи стучат в стену Нужен врач прямо сейчас Короче, единственный кто реально помог — нарколог на дом срочно Дал рекомендации и успокоил семью В общем, не потеряйте контакты — нарколог анонимно https://stoimost.narkolog-na-dom-moskva-pcr.ru Звоните прямо сейчас Перешлите тем кто в такой же ситуации

  2. Ребята у кого бизнес То вообще непонятно кому доверять Нанял нескольких специалистов Короче, реально толковый эксперт — авет миракян с многолетним опытом Спасибо ему за работу В общем, сохраняйте себе — авет миракян авет миракян Не рискуйте своими деньгами Перешлите тому у кого бизнес

  3. Нужна бесплатная юридическая консультация? Переходите по запросу юристы в Туле бесплатно круглосуточно и получите помощь опытных правозащитников в любой области права: семейные споры, долги и кредиты, недвижимость, трудовые конфликты, защита прав потребителей и многое другое. Задайте вопрос онлайн или по телефону и получите подробный разбор вашей ситуации и рекомендации адвоката по дальнейшим действиям. Консультация проводится бесплатно и конфиденциально.

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

  5. Все процедуры проводятся под круглосуточным наблюдением. Применяются инфузионные растворы, седативные и противосудорожные средства, а также поддерживающие препараты, позволяющие уменьшить нагрузку на жизненно важные органы.
    Получить дополнительные сведения – https://narkologicheskaya-klinika-volgograd9.ru/

  6. Алкогольный запой представляет собой тяжелое состояние, вызванное длительным бесконтрольным употреблением спиртных напитков. Без медицинского вмешательства вывести организм из запоя может быть сложно и даже опасно. Срочная помощь нарколога требуется при следующих признаках:
    Узнать больше – вызвать капельницу от запоя в нижний новгороде

  7. Алкогольный запой представляет собой тяжелое состояние, вызванное длительным бесконтрольным употреблением спиртных напитков. Без медицинского вмешательства вывести организм из запоя может быть сложно и даже опасно. Срочная помощь нарколога требуется при следующих признаках:
    Ознакомиться с деталями – капельница от запоя на дому

  8. Эта публикация исследует взаимосвязь зависимости и психологии. Мы обсудим, как психологические аспекты влияют на появление зависимостей и процесс выздоровления. Читатели смогут понять важность профессиональной поддержки и применения научных подходов в терапии.
    Только для своих – алкогольное отравление какой

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

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

  11. При остром алкогольном отравлении появляются головокружение, рвота, сильная слабость, скачки давления, нарушение дыхания, обмороки и судороги. Это сигнал о том, что организм не справляется с интоксикацией, и без срочного медицинского вмешательства возможны опасные осложнения, вплоть до комы.
    Подробнее – https://narcolog-na-dom-novokuznetsk00.ru/narkolog-na-dom-klinika-novokuzneczk/

  12. Вывод из запоя в Мурманске представляет собой комплекс мероприятий, направленных на оказание медицинской помощи пациентам, находящимся в состоянии алкогольного отравления или длительного употребления спиртного. Процедура проводится с целью стабилизации состояния организма, предупреждения осложнений и минимизации риска развития тяжелых последствий алкоголизма.
    Узнать больше – https://vyvod-iz-zapoya-v-murmanske12.ru/

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

  14. Люди подскажите Муж просто потерял себя Дети напуганы Нужен врач прямо сейчас Короче, врач приехал и поставил систему — вызвать нарколога на дом быстро Через пару часов человек пришёл в себя В общем, вся инфа по ссылке — нарколог на дом клиника https://chastnyj.narkolog-na-dom-moskva-uxm.ru Нарколог на дом — это реальный выход Перешлите тем кто в такой же ситуации

  15. Эта публикация исследует взаимосвязь зависимости и психологии. Мы обсудим, как психологические аспекты влияют на появление зависимостей и процесс выздоровления. Читатели смогут понять важность профессиональной поддержки и применения научных подходов в терапии.
    Как достичь результата? – как быстро избавиться от похмельного синдрома

  16. В данной статье рассматриваются проблемы общественного здоровья и социальные факторы, влияющие на него. Мы акцентируем внимание на значении профилактики и осведомленности в защите здоровья на уровне общества. Читатели смогут узнать о новых инициативах и программах, направленных на улучшение здоровья населения.
    Нажми и узнай всё – как снять отеки после алкоголя

  17. Особую опасность представляет белая горячка (алкогольный психоз). У пациента возникают галлюцинации, приступы паники, агрессивное поведение, дезориентация во времени и пространстве. Это состояние требует незамедлительного вмешательства врача, так как человек может представлять опасность для себя и окружающих.
    Углубиться в тему – выезд нарколога на дом в новокузнецке

  18. Слушайте кто карнизы ищет Цены космос а качество мыло То алюминий гнется Короче, нашел нормальный рейтинг — какой карниз для штор лучше выбрать Выбор огромный В общем, там рейтинг и отзывы — best рейтинг профильных карнизов best рейтинг профильных карнизов Изучите рейтинг перед покупкой Перешлите тому кто ищет карнизы

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

  20. Игнорирование этих симптомов или попытки самолечения могут привести к серьезным осложнениям. Своевременная установка капельницы на дому позволяет быстро улучшить состояние пациента и минимизировать последствия запоя.
    Изучить вопрос глубже – http://kapelnica-ot-zapoya-nizhniy-novgorod0.ru

  21. Здорова, народ Близкий человек уже несколько дней в запое Жена в истерике Таблетки не помогают Короче, только это реально спасло — вызов нарколога на дом круглосуточно без выходных Приехал через 40 минут В общем, не потеряйте контакты — нарколог на дом клиника https://czena.narkolog-na-dom-moskva-rty.ru Звоните прямо сейчас Перешлите тем кто в такой же ситуации

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

  23. Особую опасность представляет белая горячка (алкогольный психоз). У пациента возникают галлюцинации, приступы паники, агрессивное поведение, дезориентация во времени и пространстве. Это состояние требует незамедлительного вмешательства врача, так как человек может представлять опасность для себя и окружающих.
    Получить дополнительную информацию – нарколог на дом срочно в новокузнецке

  24. Особую опасность представляет белая горячка (алкогольный психоз). У пациента возникают галлюцинации, приступы паники, агрессивное поведение, дезориентация во времени и пространстве. Это состояние требует незамедлительного вмешательства врача, так как человек может представлять опасность для себя и окружающих.
    Выяснить больше – https://narcolog-na-dom-novokuznetsk00.ru/narkolog-na-dom-klinika-novokuzneczk

  25. Особую опасность представляет белая горячка (алкогольный психоз). У пациента возникают галлюцинации, приступы паники, агрессивное поведение, дезориентация во времени и пространстве. Это состояние требует незамедлительного вмешательства врача, так как человек может представлять опасность для себя и окружающих.
    Подробнее – запой нарколог на дом новокузнецк

  26. Особую опасность представляет белая горячка (алкогольный психоз). У пациента возникают галлюцинации, приступы паники, агрессивное поведение, дезориентация во времени и пространстве. Это состояние требует незамедлительного вмешательства врача, так как человек может представлять опасность для себя и окружающих.
    Изучить вопрос глубже – вызов врача нарколога на дом в новокузнецке

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

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

  29. Алкогольная зависимость и ее острые последствия требуют немедленного врачебного вмешательства. Наша наркологическая служба в Люберцах предлагает оперативный вызов нарколога в любое время и день недели, врач выезжает по указанному адресу сразу после оформления заявки. Мы понимаем, что в критической ситуации счет идет на минуты, поэтому выезд специалиста организован так, чтобы вы или ваш близкий человек получили квалифицированную поддержку максимально быстро. Когда врач приезжает на вызов, то в первую очередь проводит обследование состояния пациента, чтобы понять, какая медицинская помощь нужна и требуется ли госпитализация в стационар. Такой подход позволяет избежать опасных осложнений хронического алкоголизма, включая нарушения работы сердца, печени и нервной системы, еще на догоспитальном этапе.
    Детальнее – narkolog-na-dom-prokapatsya

  30. Согласно данным НМИЦ психиатрии и наркологии Минздрава РФ, профессиональный вывод из запоя с применением капельниц снижает риск осложнений и сокращает период восстановления. Процедура проводится только под наблюдением квалифицированных специалистов и требует правильного подбора препаратов в зависимости от стадии опьянения и наличия сопутствующих заболеваний.
    Получить дополнительные сведения – http://kapelnicza-ot-zapoya-pervouralsk11.ru

  31. Информация об обращении не передается третьим лицам, а детали лечения обсуждаются только с пациентом.
    Выяснить больше – vyvod-iz-zapoya-na-domu

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

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

  34. Нарколог на дом в Новокузнецке – это возможность получить профессиональное медицинское лечение без госпитализации. Специалисты клиники «ЧистоЖизнь» приезжают в любое время суток, проводят детоксикацию, снимают абстинентный синдром и помогают пациенту стабилизировать состояние в комфортных домашних условиях.
    Получить больше информации – нарколог на дом недорого новокузнецк

  35. Врач-нарколог проводит осмотр, собирает анамнез, оценивает клиническую картину, уточняет данные о лекарствах, прошлых кодированиях, хронических диагнозах, нарушениях сна и психики. При необходимости назначаются ЭКГ, анализы, тест на вещества, консультация психиатра или психотерапевта. В лечении используются солевой раствор, витамины, седативные препараты, гепатопротекторы, кардиопротекторы и средства, которые нормализуют обменные процессы, восстанавливают водно-солевой баланс и улучшают работу внутренних органов.
    Подробнее тут – vyvod-iz-zapoya-kruglosutochno

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

  37. Наркологическая помощь в Люберцах может проводиться на дому, амбулаторно или в стационаре клиники. Формат подбирает врач после осмотра пациента, оценки длительности запоя, количества алкоголя, возраста, наличия хронических заболеваний, психического состояния и возможных осложнений. Главный принцип медицинской работы — не просто вывести человека из состояния опьянения или похмельного синдрома, а стабилизировать организм, снизить риск срыва и начать лечение алкогольной зависимости.
    Разобраться лучше – https://vyvod-iz-zapoya-v-lyubercah14-2.ru/

  38. Схема помощи зависит от состояния, стажа употребления, противопоказаний и дальнейших целей лечения.
    Подробнее тут – narkolog-kapelnica-na-dom

  39. Как подчёркивает заведующий отделением клиники доктор Илья Рожнов, «только честный и целостный подход позволяет восстановить личность, разрушенную зависимостью. Наркологическая клиника в Волгограде — профессиональное лечение зависимостей строит не просто курс терапии, а мост между человеком и его новой жизнью».
    Изучить вопрос глубже – лечение в наркологической клинике в волгограде

  40. Москва, всем привет Отец не выходит из штопора Жена в истерике В больницу тащить страшно Короче, только это реально спасло — вывод из запоя с выездом врача Приехали через 40 минут В общем, не потеряйте контакты — вывод из запоя на дому москва вывод из запоя на дому москва Не ждите пока станет хуже Перешлите тем кто в такой же ситуации

发表回复

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