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

86,270 条评论

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

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

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

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

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

  6. Капельница на дому не сводится к механическому введению раствора. Медик оценивает состояние пациента, давление, пульс, температуру, показатели крови при наличии результатов, переносимость препаратов и вероятность осложнений. Для медицинского персонала важны качество процедуры, корректная дозировка и контроль реакции организма. Выездной формат особенно удобен пожилому человеку, человеку со сниженной физической активностью или тому, кому тяжело посещать клиники самостоятельно.
    Ознакомиться с деталями – https://nadomu1.kapelnica-ot-zapoya-v-moskve14-1.ru/

  7. Инфузионная терапия применяется не по одному факту употребления алкоголя, а с учетом клинической картины. Капельница от запоя может быть рекомендована, когда человеку плохо после нескольких дней приема спиртного, выражены симптомы интоксикации, организм потерял много воды и солей, а обычное питание и питье не позволяют быстро восстановить баланс. Главное для безопасного лечения — не пытаться самостоятельно ставить капельницу, использовать неизвестные препараты или резко увеличивать дозу успокоительных и снотворных средств.
    Дополнительная информация – kapelnica-ot-zapoya-na-domu-cena-moskva

  8. Главное при обращении за помощью — не выбирать препараты самостоятельно и не пытаться максимально быстро вывести человека из тяжелого запоя без диагностики. В некоторых случаях домашняя капельница возможна, однако при судорогах, выраженных нарушениях сознания, галлюцинациях, признаках алкогольного психоза, резких скачках давления или других угрожающих жизни симптомах требуется стационарное лечение либо экстренное обращение в скорую помощь. Специалисты «Мед Алко» оценивают ситуацию перед началом процедуры и объясняют родственникам, какой вариант медицинской помощи является оптимальным.
    Подробнее – заказать капельницу от запоя на дому

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

  10. Алкогольный запой — это состояние, при котором человек теряет способность самостоятельно прекратить потребление спиртного и контролировать дозировку. В таких условиях нарастают неврологические и метаболические нарушения, возрастает риск серьёзных осложнений вплоть до алкогольного делирия. Наркологическая клиника «СамараМед» предлагает круглосуточную выездную помощь на дому в Самаре и области с гарантией полной анонимности и выездом специалиста в течение 30 минут после обращения. Наши врачи применяют современные протоколы детоксикации и психологической поддержки, что позволяет безопасно и максимально комфортно пройти через этап выхода из запоя и заложить прочный фундамент для дальнейшего восстановления.
    Исследовать вопрос подробнее – http://тайный-вывод-из-запоя.рф

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

  12. Мы никогда не «лечим по заголовку». На старте фиксируем витальные показатели, собираем лекарственную историю и оцениваем факторы среды — график работы, «шум» дома, уровень физической активности, качество ночи. Параллельно обсуждаем, что для человека важнее сейчас: быстро «снять волну» симптомов, мягко перестроить вечерние привычки, настроить семейные договорённости или объединить всё это в короткий интенсивный период. Пациент получает не набор процедур, а маршрут: цель каждого шага, окно оценки эффекта, признаки успеха и заранее оговорённые условия для эскалации наблюдения.
    Разобраться лучше – запой наркологическая клиника

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

  14. Поэтапное лечение помогает врачам контролировать процесс восстановления и своевременно корректировать терапию в зависимости от состояния пациента.
    Получить дополнительную информацию – http://narkologicheskaya-klinika-v-samare16.ru

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

  16. Реабилитационные мероприятия в клинике направлены на устранение соматических последствий зависимости, нормализацию когнитивных функций и восстановление социальной адаптации. Для этого используются современные методики физиотерапии, диетологической коррекции и психологического сопровождения, позволяющие закрепить достигнутые результаты лечения.
    Узнать больше – https://narkologicheskaya-klinika-v-spb16.ru/

  17. Наркологическая служба работает с разными ситуациями: короткий пивной запой, многодневные запои, продолжительный прием крепкого спиртного, повторные срывы, сочетание алкогольной зависимости с тревожными или депрессивными расстройствами. Помочь важно не только физически: после стабилизации обсуждаются психотерапия, кодирование, реабилитация и поддержка родственников. Пациента не принуждают к одному методу — программа формируется индивидуально. Если семья столкнулась с такой ситуацией впервые и близкие не уверены, что делать, можно позвонить, получить ответы на основные вопросы и записаться на консультацию.
    Получить больше информации – vyvod-iz-zapoya-na-domu-balashiha-ceny

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

  19. Как цяла зима мечтаеше за море. Не знае откъде да започне. Почивки в Египет — Има значение кой сезон избираш. Има варианти с полет и трансфер. Евтина почивка в Египет — И за тези, които търсят лукс. Цялата информация е достъпна тук: семейна почивка в Египет семейна почивка в Египет Там ще намерите и оферти за Египет за всяка компания. Проверете офертите навреме.

  20. Наши специалисты оценивают клинические признаки запоя уже при первом осмотре — измеряют пульс, артериальное давление и насыщение кислородом, осматривают кожу и слизистые оболочки на предмет обезвоживания. Специальные тесты на когнитивные функции позволяют определить степень дезориентации и риск развития острых психотических реакций.
    Разобраться лучше – http://тайный-вывод-из-запоя.рф

  21. Если дома нет возможности обеспечить тишину (ремонт, маленькие дети, гости), можно кратко перейти в «тихий стационар» с отдельным входом; после стабилизации сопровождение возвращается на дом, и маршрут продолжается «зеркально» — с теми же целями и окнами оценки. Такой перенос сохраняет управляемость процесса и снижает тревогу семьи: никто не «начинает сначала», меняется только место, а логика остаётся прежней.
    Выяснить больше – скорая наркологическая помощь

  22. Но без помощи не получается. Кодировка — один из способов. Нарколог на дом вывод из запоя — это когда врач приезжает сам. Сначала уходит интоксикация. Круглосуточный вывод из запоя — Без лишних вопросов. Советую глянуть источник: срочный вывод из запоя срочный вывод из запоя И про то, как прокапаться на дому по Москве. Не откладывайте на потом.

  23. После введения капельницы пациент получает «вечернюю карточку»: правила гидратации малыми порциями, световую гигиену, два-три спокойных действия на вечер и чек-лист признаков, при которых нужно связаться с дежурным врачом. Такой бытовой протокол повышает переносимость терапии и делает ночь предсказуемой.
    Узнать больше – http://vyvod-iz-zapoya-v-kazani16.ru/vyvod-iz-zapoya-kazan-na-domu/

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

  25. Как цяла зима мечтаеше за море. Не знае откъде да започне. Почивка в Египет — Има значение кой сезон избираш. Има варианти с полет и трансфер. Египет последна минута оферти — И за ранни записвания. Цялата информация е достъпна тук: екскурзия до Египет екскурзия до Египет И семейна почивка в Египет за всяка компания. Проверете офертите навреме.

  26. Дома уже никто не знал, что делать. Вызвали нарколога. Вывод из запоя стационар — Круглосуточно. Сначала снимают интоксикацию. Вывод из запоя круглосуточно — Когда дома уже не вариант. Можете ознакомиться по ссылке: вывод из запоя круглосуточно спб вывод из запоя круглосуточно спб Там и про вывод из запоя в клинике для Ленобласти. Иногда стационар — единственный выход.

  27. Сразу важно проговорить: кодирование — это «замок» на поведение и физиологию, который помогает удержать ремиссию, пока человек выстраивает новые привычки и восстанавливает качество жизни. Поэтому эффект процедуры прямо зависит от того, насколько грамотно выстроены подготовка, информирование и поддержка после вмешательства. «НеоТрезвие СПБ» делает акцент на постепенности: один этап — одна цель — один прозрачный маркер успеха.
    Разобраться лучше – http://kodirovanie-ot-alkogolizma-v-spb16.ru/kodirovanie-ot-alkogolizma-v-sankt-peterburge-czeny/

  28. Спомням си, приятелка разказваше. Не знае откъде да започне. Почивки в Египет — Има значение кой сезон избираш. Има варианти с полет и трансфер. Египет последна минута оферти — И за ранни записвания. Цялата информация е достъпна тук: ваканция в Египет ваканция в Египет Там ще намерите и оферти за Египет за всеки бюджет. Понякога ранното записване спестява доста.

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

  30. И срывается снова и снова. Кодировка — один из способов. Нарколог на дом вывод из запоя — Осматривает, ставит капельницу. И человек начинает соображать. Круглосуточный вывод из запоя — Без лишних вопросов. Советую глянуть источник: вывести из запоя вывести из запоя И про капельницу от похмелья на дому для жителей столицы. Иногда промедление стоит здоровья.

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

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

  33. Муж её пил неделю, потом вообще слег. Что нужен стационар, дома уже не вытянуть. Вывод из запоя в стационаре — Круглосуточно. И только потом начинают основное лечение. Вывод из запоя СПб стационар — Без лишнего риска. Можете ознакомиться по ссылке: вывод из запоя стационар вывод из запоя стационар И про стационар в СПб. Обращайтесь к специалистам.

  34. Особенность петербургского контекста — большая доля интеллектуального труда и проектной занятости. Мы учитываем это при выборе методики: отдаем предпочтение схемам, которые не «глушат» когнитивную активность и позволяют быстро возвращаться к задачам. Если требуются краткие больничные листы, предоставляем корректные медицинские документы без «ярлыков».
    Получить дополнительные сведения – https://kodirovanie-ot-alkogolizma-v-spb16.ru/kodirovanie-ot-alkogolizma-na-domu-v-sankt-peterburge

  35. Дома уже никто не знал, что делать. Вызвали нарколога. Вывод из запоя стационар — И без доступа к спиртному. Потом стабилизируют давление. Выведение из запоя в стационаре СПб — Без лишнего риска. Можете ознакомиться по ссылке: круглосуточный стационар выведение из запоя https://vrach.vyvod-iz-zapoya-v-staczionare-spb-gdi.ru Там и про вывод из запоя в клинике для жителей Северной столицы. Иногда стационар — единственный выход.

  36. При острой интоксикации врач определяет объем медицинской помощи и необходимость стационара. Клиника не рекомендует самостоятельно использовать сильнодействующие препараты. Любые лекарственные вмешательства должны выполняться после оценки состояния.
    Дополнительная информация – https://narkologicheskaya-klinika-v-krasnoyarske20.ru/

  37. Особенность петербургского контекста — большая доля интеллектуального труда и проектной занятости. Мы учитываем это при выборе методики: отдаем предпочтение схемам, которые не «глушат» когнитивную активность и позволяют быстро возвращаться к задачам. Если требуются краткие больничные листы, предоставляем корректные медицинские документы без «ярлыков».
    Разобраться лучше – http://kodirovanie-ot-alkogolizma-v-spb16.ru

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

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

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

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

  42. Клиника рассматривает каждый случай индивидуально. Врач оценивает не только факт употребления, но и наличие синдрома отмены, хронических заболеваний, психических расстройств и предыдущего опыта лечения. Очень большое значение имеет готовность человека сотрудничать со специалистами.
    Ознакомиться с деталями – https://narkologicheskaya-klinika-v-krasnoyarske20.ru/

发表回复

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