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/ |