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

92,699 条评论

  1. Помогаем быстро перейти от консультации к конкретному плану: выезд, стационар или наблюдение.
    Подробнее – vyzov-kapelnicy-na-dom

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

  3. Столкнулись с бедой в семье. Куда звонить среди ночи. Наркологический центр — это не просто слова. Осмотрят, поставят капельницу. Скорая наркологическая помощь СПб — Без осуждения. Вся информация доступна здесь: клиника лечения алкоголизма https://narkolog.narkologicheskaya-klinika-spb-hdx.ru И про лучшие наркологические клиники СПб для жителей Северной столицы. Иногда промедление стоит жизни.

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

  5. Если врач считает домашнее лечение небезопасным, родственникам объясняют причины и предлагают стационарное наблюдение. Такая тактика снижает риск осложнений и позволяет выполнить полную диагностику. В клинике доступен дежурный медицинский персонал, а при необходимости привлекается психиатр, проводится экспресс-оценка, ЭКГ и другие мероприятия.
    Узнать больше – https://2.kapelnica-ot-zapoya-v-moskve14.ru/

  6. Психотерапия в лечении алкоголизма играет важнейшую роль. Используются когнитивно-поведенческие техники, групповые занятия, а также индивидуальные консультации с психологами и психотерапевтами. Применение методов мотивационного интервьюирования способствует формированию устойчивой мотивации на трезвость, что подробно описано в исследованиях Американской психиатрической ассоциации. Также актуальную информацию можно найти на портале Психологической ассоциации России.
    Ознакомиться с деталями – лечение алкоголизма краснодар.

  7. Столкнулись с бедой в семье. Куда звонить среди ночи. Наркологическая клиника — За ними стоят люди, готовые помочь. Объяснят, что делать дальше. Наркологическая помощь стационар — работает без постановки на учёт. Вся информация доступна здесь: наркологическая клиника клиника помощь https://narkolog.narkologicheskaya-klinika-spb-hdx.ru И про лучшие наркологические клиники СПб по городу. Иногда промедление стоит жизни.

  8. Что дома уже не отлежаться. Родные не спят ночами. Похмелье наркологический стационар — И без доступа к алкоголю. Потом стабилизируют состояние. Наркологическая клиника стационар — Когда дома уже не вариант. Можете ознакомиться по ссылке: цена на вывод из запоя в стационаре https://pohmelye.narkologicheskij-staczionar-msk-jlz.ru И про условия размещения по Москве. Не тяните, если дома уже не справляетесь.

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

  10. После бурной недели бывает так плохо. А в обычную больницу класть не хочется. Похмелье наркологический стационар — И без доступа к алкоголю. Сначала снимают интоксикацию. Вывод из запоя Москва стационар — работает и в тяжёлых случаях. Можете ознакомиться по ссылке: лечение алкоголизма в стационаре цены москва https://pohmelye.narkologicheskij-staczionar-msk-jlz.ru Там и про наркологическую клинику в Москве цены для Московской области. Иногда стационар — единственный выход.

  11. Столкнулись с бедой в семье. Тут голова кругом идёт. Наркологический центр — За ними стоят люди, готовые помочь. Специалисты приедут на дом. Скорая наркологическая помощь СПб — Без осуждения. Вся информация доступна здесь: наркологическая клиника спб наркологическая клиника спб И про лучшие наркологические клиники СПб для Ленобласти. Иногда промедление стоит жизни.

  12. Нужен присмотр и капельницы под контролем. А в обычную больницу класть не хочется. Стационар наркологический — Круглосуточно. Потом стабилизируют состояние. Лечение алкоголизма в Москве стационар — Когда дома уже не вариант. Можете ознакомиться по ссылке: нарколог стационар https://pohmelye.narkologicheskij-staczionar-msk-jlz.ru Там и про наркологическую клинику в Москве цены для Московской области. Обращайтесь к специалистам.

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

  14. И сам уже не может остановиться. И это понятно. Нарколог на дом — Без лишних вопросов. Выезд нарколога на дом — Дома. Можете ознакомиться по ссылке: вызов врача нарколога на дом вызов врача нарколога на дом И про вызов врача для Московской области. Берегите себя и близких.

  15. Домашняя наркология удобна, когда состояние относительно стабильное и нет признаков, угрожающих жизни. Однако возможность поставить капельницу на дому ограничена при серьезных осложнениях. Делирий, галлюцинации, судороги, потеря сознания, выраженная агрессия, высокая температура, сильная боль, тяжелая рвота, психозы и резкое нарушение сердечного ритма могут потребовать госпитализации. В подобных случаях задача врача — не проводить процедуру любой ценой, а выбрать безопасный вариант помощи.
    Изучить вопрос подробнее – kapelnica-dlya-alkogolika-na-domu

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

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

  18. Нужен присмотр и капельницы под контролем. А в обычную больницу класть не хочется. Стационар наркологический — это когда человек под присмотром врачей. Потом стабилизируют состояние. Наркологическая клиника стационар — работает и в тяжёлых случаях. Советую глянуть источник: стоимость лечения в наркологической клинике https://detoks.narkologicheskij-staczionar-msk-wbo.ru И про адреса для Москвы. Иногда стационар — единственный выход.

  19. И дома уже не вытянуть. А в больницу обычную класть не хочется. Стационар наркологический — это когда человек под присмотром врачей. И только после этого начинают основное лечение. Лечение алкоголизма в Москве стационар — Когда дома уже не вариант. Вся информация доступна здесь: дневной наркологический стационар https://narkolog.narkologicheskij-staczionar-msk-wbo.ru И про условия размещения по Москве. Обращайтесь к специалистам.

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

  21. Вывод из запоя осуществляется в несколько этапов, каждый из которых направлен на постепенное восстановление организма. Такой поэтапный подход снижает нагрузку на внутренние органы и повышает эффективность лечения.
    Разобраться лучше – https://vyvod-iz-zapoya-v-rostove-na-donu16.ru/vyvod-iz-zapoya-na-domu-rostov-na-donu

  22. Медицинские услуги на дому выбирают при стабильном самочувствии, когда нет признаков тяжелого острого состояния и врач допускает лечение вне клиники. На дому можно провести курс назначенных внутривенных капельниц, выполнить отдельный укол, организовать наблюдение медсестры и получить консультацию врача. Услуга полезна, если обратившемуся сложно самостоятельно приехать на прием или требуется провести лечение в удобное время.
    Подробнее – http://nadomu2.kapelnica-ot-zapoya-v-moskve14-1.ru

  23. После списка важно подчеркнуть: вывод из запоя не должен превращаться в самолечение. Если пациент принимает препараты постоянно, врачу необходимо сообщить названия и дозировки, но самостоятельно повторять чужие назначения нельзя. Лечение подбирается индивидуально.
    Дополнительная информация – https://vyvod-iz-zapoya-krasnoyarsk67.ru/

  24. Ситуация знакомая многим. Вызвать нарколога — единственный выход. Вызов нарколога на дом — Без лишних вопросов. Врач нарколог на дом анонимно и круглосуточно — Без чужих глаз. Можете ознакомиться по ссылке: нарколог на дом в москве недорого нарколог на дом в москве недорого И про вызов врача в Москве. Иногда один звонок меняет всё.

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

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

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

  28. Ситуация знакомая многим. И это понятно. Нарколог на дом — Без осуждения. Наркологическая помощь — Без чужих глаз. Можете ознакомиться по ссылке: анонимный врач нарколог на дом анонимный врач нарколог на дом Там и про телефон нарколога на дом для жителей столицы. Иногда один звонок меняет всё.

  29. У друга отец пил неделю. Обзвонила всех знакомых. Вызов нарколога на дом — это когда врач приезжает сам. Сначала стало легче. Выезд нарколога на дом — Без осуждения и лишних вопросов. Советую глянуть источник: вывод из запоя на дому москва круглосуточно https://zapoy.narkolog-na-dom-moskva-qtr.ru И про вызов врача для Московской области. Обращайтесь к специалистам.

  30. И сам уже не может остановиться. Не знаешь, за что хвататься. Наркологический центр СПб — За ними стоят люди, готовые помочь. Объяснят, что делать дальше. Частная наркологическая клиника — Без лишних вопросов. Вся информация доступна здесь: лечение алкоголизма санкт-петербург https://detoks.narkologicheskaya-klinika-spb-hdx.ru И про лучшие наркологические клиники СПб в СПб. Не ждите, пока станет хуже.

  31. И дома уже не вытянуть. Родные не спят ночами. Стационар наркологический — И без доступа к алкоголю. Сначала снимают интоксикацию. Вывод из запоя Москва стационар — работает и в тяжёлых случаях. Вся информация доступна здесь: лечение в наркологическом стационаре https://narkolog.narkologicheskij-staczionar-msk-wbo.ru И про адреса для Московской области. Обращайтесь к специалистам.

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

  33. Столкнулись с бедой в семье. Куда звонить среди ночи. Наркологическая клиника СПб — За ними стоят люди, готовые помочь. Объяснят, что делать дальше. Наркологическая помощь стационар — Без лишних вопросов. Вся информация доступна здесь: наркологическое лечение алкоголизма https://detoks.narkologicheskaya-klinika-spb-hdx.ru Там и про лечение алкоголизма в СПб для Ленобласти. Не ждите, пока станет хуже.

  34. Помню, соседка рассказывала. Давление скакало. Наркологическая клиника — это когда врач приезжает сам. И человеку реально становится легче. Врач наркологическая клиника СПб — Без осуждения и лишних вопросов. Советую глянуть источник: частная наркологическая клиника спб частная наркологическая клиника спб Там и про лечение алкоголизма в СПб для Ленобласти. Не тяните до последнего.

  35. Близкий пьёт неделями. Тут голова кругом идёт. Наркологический центр СПб — За ними стоят люди, готовые помочь. Осмотрят, поставят капельницу. Частная наркологическая клиника — работает без постановки на учёт. Вся информация доступна здесь: лечение алкоголизма в санкт-петербурге https://detoks.narkologicheskaya-klinika-spb-hdx.ru И про центр наркологической помощи для Ленобласти. Иногда промедление стоит жизни.

  36. Доказательную базу терапии подтверждают данные с Национального института наркологии.
    Подробнее тут – http://

  37. К стандартным ситуациям, в которых врач может рассматривать домашнюю инфузию, относятся следующие случаи:
    Дополнительная информация – platnye-kapelnicy-na-domu

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

  39. Лечение проводится поэтапно, начиная с оценки состояния и заканчивая восстановлением после интоксикации. Каждый этап направлен на устранение симптомов отравления и стабилизацию работы внутренних органов.
    Узнать больше – https://narkolog-na-dom-v-chelyabinske16.ru/

  40. Подробности о методах детоксикации и профилактике абстиненции можно найти на сайте Национального института по борьбе с зависимостями США (NIDA). В ходе детоксикации применяется мониторинг жизненных показателей, что обеспечивает безопасность пациента. Своевременная медицинская помощь при абстинентном синдроме предотвращает развитие тяжелых осложнений, включая судороги и сердечно-сосудистые кризы.
    Углубиться в тему – наркологическая клиника екатеринбург.

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

  42. Капельница, устанавливаемая наркологом на дому в Челябинске, помогает быстро очистить организм от токсинов и нормализовать водно-солевой баланс. Растворы включают витамины, анальгетики, седативные и гепатопротекторные препараты. Эффект от процедуры ощущается уже через 20–30 минут. Капельница снижает головную боль, устраняет тошноту, восстанавливает работу печени и сердечно-сосудистой системы. Такой метод считается одним из самых эффективных способов вывести пациента из запойного или абстинентного состояния без визита в стационар.
    Ознакомиться с деталями – нарколог на дом цены челябинск

发表回复

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