имеем MIPS32 процессор, кросс-компилятор GCC 4.6.4 включая stl, для bare metal (на железе нет ОС). Требуется контролировать размер стека.
Граница кучи контролируется функцией sbrk(), но как быть со стеком. Нет проблем написать на асме вызов функции согласно соглашению о вызове функций GCC с контролем $sp и $fp, но как быть с сотнями библиотечных функций и уже написанным кодом на С++? Может можно как-то фиксировано задать размер стека с помощью флагов GCC? что произойдёт при выходе $sp за границы стека в "с" коде, в "с++" (в смысле узнаю ли я об этом с помощью прерываний или исключений)? Или это нереальная для реализации задача?
Здравствуйте, _smit, Вы писали:
_>имеем MIPS32 процессор, кросс-компилятор GCC 4.6.4 включая stl, для bare metal (на железе нет ОС). Требуется контролировать размер стека.
_>Граница кучи контролируется функцией sbrk(), но как быть со стеком. Нет проблем написать на асме вызов функции согласно соглашению о вызове функций GCC с контролем $sp и $fp, но как быть с сотнями библиотечных функций и уже написанным кодом на С++? Может можно как-то фиксировано задать размер стека с помощью флагов GCC? что произойдёт при выходе $sp за границы стека в "с" коде, в "с++" (в смысле узнаю ли я об этом с помощью прерываний или исключений)? Или это нереальная для реализации задача?
https://gcc.gnu.org/onlinedocs/gccint/Stack-Checking.html ?
Здравствуйте, Zhendos, Вы писали:
Z>Здравствуйте, _smit, Вы писали:
_>>имеем MIPS32 процессор, кросс-компилятор GCC 4.6.4 включая stl, для bare metal (на железе нет ОС). Требуется контролировать размер стека.
_>>... Или это нереальная для реализации задача?
Z>https://gcc.gnu.org/onlinedocs/gccint/Stack-Checking.html ?
Спасибо, поиграюсь опциями... надеюсь это опции сборки, а не компилятора. Есть ещё идея разместить стек снизу. Упрощается контроль кучи, потолок которой теперь не зависит от указателя стека. При этом указатель стека при достижении "дна памяти" (нулевого адреса) должен вызвать аппаратное исключение доступа по "ошибочному адресу".
Здравствуйте, _smit, Вы писали:
_>Здравствуйте, Zhendos, Вы писали:
Z>>Здравствуйте, _smit, Вы писали:
_>>>имеем MIPS32 процессор, кросс-компилятор GCC 4.6.4 включая stl, для bare metal (на железе нет ОС). Требуется контролировать размер стека.
_>>>... Или это нереальная для реализации задача?
Z>>https://gcc.gnu.org/onlinedocs/gccint/Stack-Checking.html ?
_>Спасибо, поиграюсь опциями... надеюсь это опции сборки, а не компилятора. Есть ещё идея разместить стек снизу. Упрощается контроль кучи, потолок которой теперь не зависит от указателя стека. При этом указатель стека при достижении "дна памяти" (нулевого адреса) должен вызвать аппаратное исключение доступа по "ошибочному адресу".
Это опции gcc, т.е. общего интерфейса к парсеру, асебмлеру и линкеру.
Кстати, если вы хотите просто проверить что стек не исчерпается,
и не применяете динамические массивы на стеке, то это можно
сделать в compile time, нужно же по сути пройти по всем цепочкам
вызовов и сложить размер стеков, в linux ядре такая проверка есть,
можно из их системы сборки вытащить.