OSDev
http://osdev.su/

Управление стеками потоков в Linux
http://osdev.su/viewtopic.php?f=6&t=101
Страница 1 из 1

Автор:  p_aleksandrov [ 05 авг 2007, 18:07 ]
Заголовок сообщения:  Управление стеками потоков в Linux

Стеки разных потоков одного процесса находятся в разных местах одного виртуального пространства или части виртуального пространства, содержащие стек, различны у потоков, принадлежащих одному и тому же процессу?

Автор:  phantom-84 [ 05 авг 2007, 21:54 ]
Заголовок сообщения:  Re: Управление стеками потоков в Linux

Про Линукс точно не могу сказать. Хотя слышал, что потоки в Линукс на аппартном уровне реализованы как задачи, а отсюда может следовать вариант, что прикладные стеки для разных потоков могут размещаться по одним и тем же адресам. Правда, может, это все относится только к системным потокам, не знаю. Однако ответ на этот вопрос найти не сложно - исходники открыты. Лично у меня прикладные стеки потоков размещаются по разным адресам ближе к концу адресного пространства приложения, но сгруппированы вплотную друг к другу (каждый стек состоит из трех участков: стоп-фрейма, резервного участка и основного рабочего участка).

Автор:  p_aleksandrov [ 05 авг 2007, 22:07 ]
Заголовок сообщения:  Re: Управление стеками потоков в Linux

Что такое стоп-фрейм?

Автор:  p_aleksandrov [ 05 авг 2007, 22:28 ]
Заголовок сообщения:  Re: Управление стеками потоков в Linux

Как определить переполнился ли стек при использовании страничной адресации (процессор IA-32)?

Автор:  sadko [ 05 авг 2007, 22:37 ]
Заголовок сообщения:  Re: Управление стеками потоков в Linux

Скорее всего, возникнет #GP.

Автор:  phantom-84 [ 05 авг 2007, 23:32 ]
Заголовок сообщения:  Re: Управление стеками потоков в Linux

Стоп-фрейм - это нераспределенный участок, обращение к которому вызывает ошибку "Переполнение прикладного стека". Это частичный ответ и на твой второй вопрос. При использовании страничной адресации для определения переполнения стека можно использовать в том числе и сегментацию. Я так поступаю при детекте переполнения стеков ядра. В 64-разрядной архитектуре имеются специализированные средства борьбы с переполнением стека, о которых я к сожалению пока толком ничего не знаю (еще не интересовался этим вопросом).

Автор:  Гость [ 06 авг 2007, 09:30 ]
Заголовок сообщения:  Re: Управление стеками потоков в Linux

Phantom-84, Кстати, а каков у тебя размер стопфрейма?

не боишься что приложение сделает

void foo()
{
buf[fraaamesize * 2];
// А дальше окажется уже в чужом стеке?
}

Автор:  pushkoff [ 06 авг 2007, 11:37 ]
Заголовок сообщения:  Re: Управление стеками потоков в Linux

Dron
Это повлияет только на работу данного приложения, поэтому ИМХО ниче страшного...
Где-то на васме говорили что компилятор большие буферы в стеке выделяет порциями по 4 к, чтоб не перепрыгнуть стоп фрейм...

Автор:  phantom-84 [ 06 авг 2007, 22:54 ]
Заголовок сообщения:  Re: Управление стеками потоков в Linux

Dron, мы на эту тему с тобой уже не раз говорили. Раньше стоп-фреймы всегда имели размер 4 Кб. Сейчас они могут иметь различный размер - от 4 Кб до 4 Мб - я просто выравниваю дно стека (т.е. фактически базу стоп-фрейма) на 4-мегабайтную границу, но так, чтобы стоп-фрейм имел ненулевой размер. Я немного не понял, какую альтернативу ты мне предлагаешь - использовать для стеков расширяемые вниз сегменты что ли? Чтобы не возникало проблем с переполнением стека, нужно просто задавать большой резерв. Да и потом глубину стека можно контролировать на прикладном уровне. И вообще большие массивы нужно не в стеке распределять, а в динамической памяти.

Автор:  Гость [ 07 авг 2007, 11:35 ]
Заголовок сообщения:  Re: Управление стеками потоков в Linux

Phantom-84, Динамическая память по определению медленнее.

Я не говорю про многомегабайтные массивы... но несколько десятков килобайт почему бы не выделить на стеке?

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/