Что делает эта сборка PPC с проверкой стека? - PullRequest
2 голосов
/ 17 декабря 2010

У меня есть следующая автономная функция (т. Е. Она ветвится до использования bl CheckStackFunc), и я озадачен ее назначением. Может кто-нибудь, знакомый со сборкой PowerPC, протянуть руку?

_CheckStackFunc:
    neg     %r11, %r12
    addi    %r0, %r11, 0xFFF
    srawi.  %r0, %r0, 0xC
    blelr
    mr      %r11, %sp
    mtctr   %r0
loc_10176B0C:                           
    lwzu    %r0, -0x1000(%r11)
    bdnz    loc_10176B0C
    blr

Как уже было сказано, я использую этот документ IBM для справки по сборке PPC. Считается ли это окончательным источником или есть другие, о которых я должен знать?

1 Ответ

4 голосов
/ 17 декабря 2010

Я совсем не знаком с КПП, но вот мое предположение:

Мне кажется, alloca_probe(). Код, который касается стека шагами страницы, чтобы вызвать исключения PAGE_GUARD. (прошу прощения за мой x86 язык :))

Используется после выделения большого стека (это также можно сделать с помощью alloca). В стеке обычно не выделяется вся память, зарезервированная для стека, последняя загруженная страница имеет специальный флаг PAGE_GUARD, который вызывает аппаратное исключение, которое перехватывается ОС, чтобы он мог фиксировать больше страниц в стеке. , Когда стек используется нормально (с push / pop), эта страница не может быть обойдена. Однако для больших выделений требуется вызов alloca_probe(), прежде чем можно будет безопасно использовать память.

...