tgoop.com/gdb_dbg/138
Create:
Last Update:
Last Update:
Налоги - это вообще неприятно, но здесь это буквально вставляет нам палки в колеса. Так уж вышло, что мы рисуем для треда не один стек, а два (стоящих в памяти подряд). В некоторых ситуациях мы экстренно переключаемся на второй (альтернативный) стек, чтобы на нем сделать кое-что важное, потом возвращаемся назад. Соответственно, у каждой из половинок стека есть guard page - защищенная на запись страница, в которую, если что, ударится исполнение, когда стек переполнится.
+------+---------------+-----+----------------------+
|||| Alt stack ||||| Real stack |
+------+---------------+-----+----------------------+
^ ^
Guard #2 <= grows Guard #1 <= grows
И финальный кусочек пазла: как вы помните, в пользовательском сценарии наша VM вызывается (инициализируется) из C кода. Т.е. размер static TLS зависит совсем не от нас, а от того, насколько много писатель сишного кода памяти потратил на
__thread
переменные. И в зависимости от этого размера начинаются спецэффекты: 1) Если размер больше половины размера нашего стека => мы ткнем в нашу защищенную страницу в серединке стека =>
SIGSEGV
,2) Если размер TLS больше, чем запрашиваемый размер стека =>
pthread_create
просто обломится,3) Если размер TLS меньше, чем половина стека => ну, TLS просто сожрет часть основного стека, т.е. SOE случится куда быстрее, чем пользователь мог бы подумать.
Чудесно! ↓
BY Алло, это отладочная?
Share with your friend now:
tgoop.com/gdb_dbg/138