从_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,777 条评论

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

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

  3. Все медицинские записи и личные данные хранятся на защищённых серверах с ограниченным доступом. Только лечащий врач и медицинская сестра имеют право просматривать их при необходимости оказания помощи.
    Подробнее тут – http://тайный-вывод-из-запоя.рф/

  4. Признаки похмелья и абстиненции могут различаться по степени тяжести. Врач учитывает не только субъективные жалобы, но и объективные показатели работы организма. В некоторых случаях медицинская капельница позволяет быстрее облегчить физическое самочувствие, однако тяжелые психические расстройства, судороги, потеря сознания, галлюцинации или признаки делирия требуют экстренного обращения за медицинской помощью и могут стать основанием для госпитализации.
    Ознакомиться с деталями – kapelnicy-ot-zapoya-otzyvy

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

  6. Стационарное лечение позволяет обеспечить круглосуточный контроль состояния, регулярное медицинское сопровождение и профессиональную поддержку психологов и наркологов. Такой подход существенно увеличивает шансы на успешное восстановление.
    Получить дополнительные сведения – https://narkologicheskaya-klinika-sochi0.ru/chastnaya-narkologicheskaya-klinika-sochi/

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

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

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

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

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

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

  13. До начала лечения врач собирает данные, уточняет жалобы и определяет подход. Нарколог рассматривает лечение на дому и лечение в клинике как два возможных формата. Для дома выбирается услуга с выездом, для клиники — лечение в условиях центра. Пациент получает объяснение, какие процедуры предполагаются и какое лечение будет продолжено. Следует, чтобы помощь соответствовала выбранному формату.
    Узнать больше – https://vyvod-iz-zapoya-krasnoyarsk70.ru/

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

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

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

  17. Стационарное лечение позволяет обеспечить круглосуточный контроль состояния, регулярное медицинское сопровождение и профессиональную поддержку психологов и наркологов. Такой подход существенно увеличивает шансы на успешное восстановление.
    Подробнее – https://narkologicheskaya-klinika-sochi0.ru/narkologicheskaya-klinika-vyvod-iz-zapoya-sochi

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

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

  20. Близкий пьёт неделю. Вызвать нарколога — единственный выход. Нарколог на дом — Без осуждения. Наркологическая помощь — Дома. Можете ознакомиться по ссылке: нарколога домой https://anonimno.narkolog-na-dom-moskva-qtr.ru Там и про телефон нарколога на дом в Москве. Иногда один звонок меняет всё.

  21. Ситуация знакомая многим. Но многие боятся огласки. Нарколог на дом — Без осуждения. Наркологическая помощь — всё делается тихо. Можете ознакомиться по ссылке: вызов наркологической помощи на дом https://anonimno.narkolog-na-dom-moskva-qtr.ru Там и про телефон нарколога на дом для жителей столицы. Берегите себя и близких.

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

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

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

  25. Если пациенту требуется постоянный мониторинг или комплексное лечение, мы обеспечиваем круглосуточное пребывание в стационаре. Здесь доступны углублённая диагностика — УЗИ органов брюшной полости, расширенные анализы крови, кардиомониторинг — и коррекция терапии в режиме реального времени. Комфортные палаты, ежедневное наблюдение медсестры и консультации психотерапевта создают условия для быстрого и безопасного выхода из зависимости.
    Разобраться лучше – https://narkologicheskaya-pomoshh-ekaterinburg0.ru/vyzvat-narkologicheskuyu-pomoshh-v-ekb/

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

  27. Что голова раскалывается. Только лежать и страдать. Похмелье нарколог на дом — И человеку становится легче. Сначала уходит интоксикация. Врач нарколог на дом анонимно и круглосуточно — без осуждения. Вся информация доступна здесь: анонимная наркологическая помощь на дому https://pohmelye.narkolog-na-dom-msk-alk.ru Там и про телефон нарколога на дом для жителей столицы. Обращайтесь к специалистам.

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

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

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

  31. Капельница от запоя обычно облегчает проявления интоксикации постепенно, а не мгновенно. По мере введения раствора врач наблюдает за реакциями, контролирует показатели и при необходимости корректирует схему. Эффект зависит от тяжести отравления, продолжительности запоя, возраста, особенностей обмена веществ, состояния внутренних органов и количества алкоголя, которое человек употреблял в последние часы и дни.
    Подробнее – kapelnica-ot-pohmelya-na-dom-moskva

  32. И руки трясутся с утра. Только лежать и страдать. Нарколог на дом — это когда врач приезжает сам. Потом возвращаются силы. Врач нарколог на дом анонимно и круглосуточно — Без постановки на учёт. Вся информация доступна здесь: наркология на дом https://pohmelye.narkolog-na-dom-msk-alk.ru И про вызов врача по Москве. Не мучайтесь, если можно помочь.

  33. Что голова раскалывается. Ни встать, ни работать. Похмелье нарколог на дом — это когда врач приезжает сам. Сначала уходит интоксикация. Выезд нарколога на дом — без осуждения. Вся информация доступна здесь: наркологическая помощь на дому круглосуточно https://pohmelye.narkolog-na-dom-msk-alk.ru И про срочный выезд для жителей столицы. Обращайтесь к специалистам.

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

  35. Доказательную базу терапии подтверждают данные с Национального института наркологии.
    Углубиться в тему – http://www.domen.ru

  36. Вывод из запоя является одной из наиболее востребованных услуг наркологической клиники. Длительный прием алкоголя приводит к накоплению токсичных продуктов распада этанола, обезвоживанию, нарушениям сна, работы сердечно-сосудистой и нервной системы. Чем дольше продолжается запой, тем выше вероятность осложнений. Медицинский вывод из запоя помогает прекратить употребление под контролем врача и начать лечение алкоголизма без опасных самостоятельных экспериментов.
    Изучить вопрос подробнее – narkologicheskaya-klinika-na-dom

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

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

  39. Капельница от запоя «Мед Алко» в Москве применяется как один из методов медицинской помощи при алкогольной интоксикации и абстинентном синдроме. Наркологическая служба организует выезд врача на дом круглосуточно, а в сложных случаях может предложить лечение в стационаре. Перед постановкой инфузии врач проводит осмотр, собирает анамнез, оценивает общее состояние человека, артериальное давление, пульс, характер жалоб, продолжительность запоя и количество выпитого спиртного. Такой подход позволяет подобрать состав раствора с учетом возраста, сопутствующих заболеваний и особенностей организма, а не использовать одинаковый стандарт для каждого обращения.
    Дополнительная информация – https://4.kapelnica-ot-zapoya-v-moskve14.ru/

  40. Но организм уже не слушается. Руки трясутся, голова не варит. Трезвость нарколог на дом — Осматривает, ставит капельницу. Потом появляются силы. Вывод из запоя на дому — это шанс вернуться к трезвости. Можете ознакомиться по ссылке: нарколог на дом круглосуточно цены https://trezvost.narkolog-na-dom-msk-alk.ru И про срочный выезд по Москве. Иногда промедление стоит здоровья.

  41. Каждый пациент проходит последовательный процесс лечения, где основное внимание уделяется безопасности, контролю состояния и постепенной адаптации. При поступлении проводится диагностика с оценкой степени зависимости, сопутствующих патологий и психологических факторов, влияющих на развитие заболевания. На основании полученных данных формируется персонализированный план терапии, включающий медикаментозные и немедикаментозные методы.
    Получить дополнительную информацию – https://narkologicheskaya-klinika-v-spb16.ru/narkolog-sankt-peterburg

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

  43. Муж пил неделю. Никто не знал, что делать. Нарколог на дом — Осматривает, ставит капельницу. А утром уже смог нормально поговорить. Наркологическая помощь — Без постановки на учёт. Советую глянуть источник: вызов нарколога на дом в москве https://narkolog.narkolog-na-dom-moskva-qtr.ru И про вызов врача по Москве. Обращайтесь к специалистам.

发表回复

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