OSDev

для всех
Текущее время: 03 май 2024, 13:37

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Управление стеками потоков в Linux
СообщениеДобавлено: 05 авг 2007, 18:07 

Зарегистрирован: 13 июл 2007, 23:16
Сообщения: 23
Стеки разных потоков одного процесса находятся в разных местах одного виртуального пространства или части виртуального пространства, содержащие стек, различны у потоков, принадлежащих одному и тому же процессу?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 авг 2007, 21:54 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 авг 2007, 22:07 

Зарегистрирован: 13 июл 2007, 23:16
Сообщения: 23
Что такое стоп-фрейм?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 авг 2007, 22:28 

Зарегистрирован: 13 июл 2007, 23:16
Сообщения: 23
Как определить переполнился ли стек при использовании страничной адресации (процессор IA-32)?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 авг 2007, 22:37 

Зарегистрирован: 02 май 2007, 14:25
Сообщения: 126
Скорее всего, возникнет #GP.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 авг 2007, 23:32 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 авг 2007, 09:30 
Phantom-84, Кстати, а каков у тебя размер стопфрейма?

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

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


Вернуться к началу
  
 
СообщениеДобавлено: 06 авг 2007, 11:37 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 авг 2007, 22:54 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 авг 2007, 11:35 
Phantom-84, Динамическая память по определению медленнее.

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


Вернуться к началу
  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 64


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB