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

91,576 条评论

  1. Услуги на дому могут использоваться при плановой инфузионной терапии, восстановлении после болезни, обезвоживании и других состояниях, при которых врач ранее назначил внутривенное введение. Подбор схемы проходит индивидуально. Капельница на дому имеет ограничения, поэтому перед ее проведением требуется медицинский прием и оценка текущих показателей.
    Дополнительная информация – kapelnica-ot-pohmelya-na-domu

  2. Вывод из запоя — это управляемая медицинская процедура, где каждая деталь важна: от скорости выезда до состава инфузии и «тихой» среды дома. В наркологической клинике «КазаньДетокс Медлайн» мы придерживаемся принципа поэтапной стабилизации: сначала безопасный старт и оценка рисков, затем прицельные капельницы и, при необходимости, краткосрочное наблюдение. Такой подход исключает «универсальные коктейли» и делает результат прогнозируемым: снижение интоксикации, выравнивание вегетативных реакций, восстановление сна и аппетита. Анонимность встроена в протоколы: немаркированный выезд, лаконичная документация, один доверенный контакт для связи 24/7, нейтральные формулировки без стигмы.
    Узнать больше – наркологический вывод из запоя

  3. Сам бросил резко, и началась ломка. Трясло так, что чашку не мог удержать. Наркологическая клиника — это когда врач приезжает сам. Потом выравнивают давление. Наркологическая помощь стационар — И в выходные. Советую глянуть источник: наркологическое лечение алкоголизма https://vrach.narkologicheskaya-klinika-spb-hdx.ru Там и про лечение алкоголизма в СПб для Ленобласти. Иногда промедление стоит здоровья.

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

  5. После бурной ночи бывает так плохо. Только лежать и страдать. Наркологическая клиника СПб — это когда врач приезжает сам. Потом возвращаются силы. Скорая наркологическая помощь СПб — Без лишних вопросов. Советую глянуть источник: наркологическая клиника санкт-петербург https://pohmelye.narkologicheskaya-klinika-spb-hdx.ru И про лучшие наркологические клиники СПб для Санкт-Петербурга. Иногда один звонок решает всё.

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

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

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

  9. И через месяц снова начал. Работал, держался. Клиника реабилитации наркозависимых — Это программа на несколько месяцев. Поэтому и результат другой. Лечение наркомании — Особенно если дома всё напоминает о прошлом. Можете ознакомиться по ссылке: реабилитация зависимых от алкоголя нижний новгород https://klinika.reabilitaczionnyj-czentr-nnovgorod-fge.ru Там и про ребцентры по области. Иногда центр — единственный шанс.

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

  11. И вроде бы всё, чистый. Без реабилитации замкнутый круг. Реабилитационный центр для наркозависимых — Это программа на несколько месяцев. А не только с симптомом. Лечение наркомании — Особенно если дома всё напоминает о прошлом. Вся информация доступна здесь: реабилитация наркозависимости нижний новгород https://lechenie.reabilitaczionnyj-czentr-nnovgorod-fge.ru И про программы по области. Обращайтесь к специалистам.

  12. Как брат её прошёл детокс. А потом как отрезало. Реабилитационный центр для наркозависимых — Это программа на несколько месяцев. А не только с симптомом. Лечение наркомании — Особенно если дома всё напоминает о прошлом. Советую глянуть источник: реабилитационный центр для алкоголиков нижний новгород хороший https://zavisimost.reabilitaczionnyj-czentr-nnovgorod-fge.ru Там и про ребцентры по области. Иногда центр — единственный шанс.

  13. Специалисты регулярно помогают при интоксикации, запоях, абстиненции и сложных состояниях зависимости.
    Дополнительная информация – postavit-kapelnicu-na-domu

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

  15. Жена его на нервах была. Запой жуткий, сам не остановится. Капельница от запоя на дому — это не роскошь, а необходимость. Через пару часов человек задышал спокойно. Срочный вывод из запоя — Без постановки на учёт. Вся информация доступна здесь: вывод из запоя на дому недорого https://narkolog.vyvod-iz-zapoya-na-domu-msk-wtk.ru И про капельницу от похмелья на дому в Москве. Не тяните, если близкий срывается.

  16. Бывает, человек уже прошёл детокс. Потому что капельница — это только начало. Центр реабилитации зависимых — С психологами, группами и режимом. А не только с симптомом. Лечение наркомании — Особенно если дома всё напоминает о прошлом. Вся информация доступна здесь: реабилитация наркозависимых в нижнем новгороде https://lechenie.reabilitaczionnyj-czentr-nnovgorod-fge.ru Там и про ребцентры в Нижнем. Обращайтесь к специалистам.

  17. И через месяц снова начал. Работал, держался. Клиника реабилитации наркозависимых — Это программа на несколько месяцев. Там работают с причиной. Реабилитация алкоголиков — Особенно если дома всё напоминает о прошлом. Можете ознакомиться по ссылке: реабилитационный центр наркозависимых реабилитационный центр наркозависимых И про программы в Нижнем. Не ждите очередного срыва.

  18. Специалист также может отказаться проводить инфузию на дому, если отсутствует подтвержденное назначение, имеются противопоказания к препарату, требуется постоянное мониторирование показателей или невозможно обеспечить безопасные условия. При наличии инфекционных заболеваний учитываются особенности организации визита и правила обработки материалов. Иногда правильный выбор — не капельница на дому, а прием в клинике, обследование или направление в профильное отделение больницы.
    Подробнее – kapelnica-na-domu

  19. И через месяц снова начал. Вроде чистый был. Реабилитационный центр для наркозависимых — это не просто стены и койки. А не только с симптомом. Лечение зависимости — Особенно если дома всё напоминает о прошлом. Можете ознакомиться по ссылке: реабилитационный центр алкоголизма реабилитационный центр алкоголизма И про программы для региона. Не ждите очередного срыва.

  20. И началась ломка. Давление скакало. Наркологическая клиника СПб — это когда врач приезжает сам. Сначала уходит интоксикация. Скорая наркологическая помощь СПб — И в выходные. Можете ознакомиться по ссылке: центр лечения алкоголизма https://kapelnica.narkologicheskaya-klinika-spb-hdx.ru Там и про лечение алкоголизма в СПб в СПб. Не тяните до последнего.

  21. А через месяц снова срывается. Потому что капельница — это только начало. Наркологический реабилитационный центр — С психологами, группами и режимом. А не только с симптомом. Лечение зависимости — Но без него срывы почти неизбежны. Вся информация доступна здесь: н новгород реабилитация алкозависимых https://lechenie.reabilitaczionnyj-czentr-nnovgorod-fge.ru И про условия размещения в Нижнем. Обращайтесь к специалистам.

  22. И через два месяца снова начал. Вроде чистый был. Центр реабилитации зависимых — Это программа на несколько месяцев. Поэтому и результат другой. Реабилитация алкоголиков — это долгий путь. Советую глянуть источник: наркологический центр ребцентр в нижнем новгороде https://zavisimost.reabilitaczionnyj-czentr-nnovgorod-fge.ru И про программы в Нижнем. Обращайтесь к специалистам.

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

  24. Я боялась, что он не выживет. Осмотрел мужа, поставил капельницу. Нарколог на дом вывод из запоя — Через два часа муж пришёл в себя. Всё анонимно, без учёта. Анонимный вывод из запоя на дому — Когда счёт идёт на часы, медлить нельзя. Проверено на себе. капельница от запоя недорого капельница от запоя недорого Там все контакты и цены для Москвы. Хотите быстро вывести из запоя — переходите по ссылке. Нарколог на дом — быстро, анонимно, эффективно!

  25. Бывает, человек уже прошёл детокс. Потому что капельница — это только начало. Наркологический реабилитационный центр — Это программа на несколько месяцев. Поэтому и результат другой. Лечение зависимости — Но без него срывы почти неизбежны. Вся информация доступна здесь: реабилитация наркомании в нижнем новгороде https://lechenie.reabilitaczionnyj-czentr-nnovgorod-fge.ru Там и про ребцентры для Нижнего Новгорода. Иногда центр — единственный шанс.

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

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

  28. Жена его на нервах была. Оказалось, опять сорвался. Нарколог на дом вывод из запоя — Когда счёт идёт на часы, медлить нельзя. Потом поспал, поел. Анонимный вывод из запоя на дому — без осуждения. Вся информация доступна здесь: нарколог вывод из запоя https://narkolog.vyvod-iz-zapoya-na-domu-msk-wtk.ru Там и про вывод из запоя цены для жителей столицы. Иногда один звонок меняет всё.

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

  30. Пил неделю, потом решил бросить. Трясло так, что чашку не мог удержать. Нарколог на дом вывод из запоя — Осматривает, ставит капельницу. Сначала уходит интоксикация. Срочный вывод из запоя — работает и ночью. Советую глянуть источник: вывод из запоя на дому москва круглосуточно https://detoks.vyvod-iz-zapoya-na-domu-msk-wtk.ru И про капельницу от похмелья на дому по Москве. Иногда промедление стоит здоровья.

  31. Дверь заперта, телефон не берёт. Оказалось, опять сорвался. Капельница от запоя на дому — Когда счёт идёт на часы, медлить нельзя. Через пару часов человек задышал спокойно. Круглосуточный вывод из запоя — Без постановки на учёт. Вся информация доступна здесь: вывод из запоя круглосуточно москва вывод из запоя круглосуточно москва И про то, как прокапаться на дому по Москве. Не тяните, если близкий срывается.

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

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

  34. Я боялась, что он не выживет. Осмотрел мужа, поставил капельницу. Вывод из запоя на дому — врач ввёл препараты. Цена оказалась приемлемой. Срочный вывод из запоя — это не роскошь, а необходимость. Проверено на себе. вывод из запоя цены вывод из запоя цены По ссылке — подробная информация для жителей столицы. Это надёжный способ. Нарколог на дом — быстро, анонимно, эффективно!

  35. Я боялась, что он не выживет. Вызвала нарколога на дом. Капельница от запоя на дому — врач ввёл препараты. Врач дал рекомендации. Срочный вывод из запоя — Специалист реально спасает. Нарколог на дом реально помогает. цены на вывод из запоя на дому цены на вывод из запоя на дому Сохраните, поделитесь, не потеряйте в Москве. Это надёжный способ. Нарколог на дом — быстро, анонимно, эффективно!

  36. Капельница от запоя «Мед Алко» в Москве — медицинская услуга для людей, которым требуется выведение продуктов распада этанола, уменьшение проявлений похмельного и абстинентного синдрома, восстановление водно-электролитного баланса и контроль общего самочувствия. Медицинский центр организует выезд специалиста на дому круглосуточно: врач-нарколог проводит осмотр, собирает анамнез, оценивает тяжесть интоксикации, наличие хронических заболеваний и только затем определяет, можно ли безопасно поставить капельницу в домашних условиях. Такой подход позволяет учитывать возраст, длительность запоя, количество выпитого алкоголя, артериальное давление, работу сердца, печени и почек.
    Узнать больше – капельница после запоя москва

  37. Помню, у знакомого была ситуация. Ни спать, ни есть. Вывод из запоя на дому — И снимает это состояние. И человеку реально становится легче. Круглосуточный вывод из запоя — Без осуждения и лишних вопросов. Советую глянуть источник: вывод из запоя анонимно москва https://detoks.vyvod-iz-zapoya-na-domu-msk-wtk.ru И про то, как прокапаться на дому по Москве. Иногда промедление стоит здоровья.

  38. Пил неделю, потом решил бросить. Давление скакало. Вывод из запоя на дому — И снимает это состояние. И человеку реально становится легче. Анонимный вывод из запоя на дому — работает и ночью. Советую глянуть источник: вывод из запоя стоимость https://detoks.vyvod-iz-zapoya-na-domu-msk-wtk.ru И про то, как прокапаться на дому по Москве. Обращайтесь к специалистам.

  39. Выездная помощь удобна, когда человек находится в сознании, способен контактировать с врачом и его состояние позволяет проводить процедуру в домашних условиях. Нарколог приезжает по указанному адресу, проводит первичный осмотр и принимает решение о возможности инфузионной терапии. Врач проверит давление, пульс, температуру, степень обезвоживания и основные неврологические признаки. При необходимости может потребоваться экспресс-диагностика, ЭКГ или перевод в стационар клиники.
    Ознакомиться с деталями – https://4.kapelnica-ot-zapoya-v-moskve14.ru/

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

  41. Чтобы помощь была прозрачной и управляемой, каждый этап имеет цель, индикаторы безопасности и эффективности, а также понятное «окно оценки» результата. Коррекции проводятся «штучно», по правилу одного изменения — это защищает от полипрагмазии и позволяет читабельно видеть вклад каждого шага.
    Подробнее – вывод из запоя вызов на дом казань

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

发表回复

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