контроль стека gcc bare metal
От: _smit Россия  
Дата: 05.03.16 17:43
Оценка:
имеем MIPS32 процессор, кросс-компилятор GCC 4.6.4 включая stl, для bare metal (на железе нет ОС). Требуется контролировать размер стека.
Граница кучи контролируется функцией sbrk(), но как быть со стеком. Нет проблем написать на асме вызов функции согласно соглашению о вызове функций GCC с контролем $sp и $fp, но как быть с сотнями библиотечных функций и уже написанным кодом на С++? Может можно как-то фиксировано задать размер стека с помощью флагов GCC? что произойдёт при выходе $sp за границы стека в "с" коде, в "с++" (в смысле узнаю ли я об этом с помощью прерываний или исключений)? Или это нереальная для реализации задача?
Re: контроль стека gcc bare metal
От: Zhendos  
Дата: 06.03.16 08:40
Оценка:
Здравствуйте, _smit, Вы писали:

_>имеем MIPS32 процессор, кросс-компилятор GCC 4.6.4 включая stl, для bare metal (на железе нет ОС). Требуется контролировать размер стека.

_>Граница кучи контролируется функцией sbrk(), но как быть со стеком. Нет проблем написать на асме вызов функции согласно соглашению о вызове функций GCC с контролем $sp и $fp, но как быть с сотнями библиотечных функций и уже написанным кодом на С++? Может можно как-то фиксировано задать размер стека с помощью флагов GCC? что произойдёт при выходе $sp за границы стека в "с" коде, в "с++" (в смысле узнаю ли я об этом с помощью прерываний или исключений)? Или это нереальная для реализации задача?

https://gcc.gnu.org/onlinedocs/gccint/Stack-Checking.html ?
Re[2]: контроль стека gcc bare metal
От: _smit Россия  
Дата: 06.03.16 16:50
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, _smit, Вы писали:


_>>имеем MIPS32 процессор, кросс-компилятор GCC 4.6.4 включая stl, для bare metal (на железе нет ОС). Требуется контролировать размер стека.

_>>... Или это нереальная для реализации задача?

Z>https://gcc.gnu.org/onlinedocs/gccint/Stack-Checking.html ?


Спасибо, поиграюсь опциями... надеюсь это опции сборки, а не компилятора. Есть ещё идея разместить стек снизу. Упрощается контроль кучи, потолок которой теперь не зависит от указателя стека. При этом указатель стека при достижении "дна памяти" (нулевого адреса) должен вызвать аппаратное исключение доступа по "ошибочному адресу".
Re[3]: контроль стека gcc bare metal
От: Zhendos  
Дата: 11.03.16 12:20
Оценка:
Здравствуйте, _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 ядре такая проверка есть,
можно из их системы сборки вытащить.
Re: контроль стека gcc bare metal
От: enji  
Дата: 13.03.16 19:29
Оценка:
Здравствуйте, _smit, Вы писали:

_>имеем MIPS32 процессор, кросс-компилятор GCC 4.6.4 включая stl, для bare metal (на железе нет ОС). Требуется контролировать размер стека.

_>Граница кучи контролируется функцией sbrk(), но как быть со стеком. Нет проблем написать на асме вызов функции согласно соглашению о вызове функций GCC с контролем $sp и $fp, но как быть с сотнями библиотечных функций и уже написанным кодом на С++?
расположи внизу стека магическое число и проверяй его периодически — скажем в прерывании по таймеру или еще как-то. Можно весь стек заполнить магическим числом и таким образом периодически вычислять текущий (а точнее максимальный) размер

_>Может можно как-то фиксировано задать размер стека с помощью флагов GCC?

ну по идее стек — это просто некая область памяти, которая задается в скрипте линкера и на которую как-то устанавливается sp при старте программы. При чем тут флаги gcc?

_>что произойдёт при выходе $sp за границы стека в "с" коде, в "с++" (в смысле узнаю ли я об этом с помощью прерываний или исключений)? Или это нереальная для реализации задача?


Это уже от твоего процессора зависит. Гипотетически можно поизвращаться, если под стеком будет невалидный/защиненный участок памяти — то при обращении к нему произойдет прерывание
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.