OSDev http://osdev.su/ |
|
Реализация многозадачности/многопоточности http://osdev.su/viewtopic.php?f=6&t=778 |
Страница 1 из 16 |
Автор: | phantom-84 [ 12 авг 2013, 12:44 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
maisvendoo писал(а): осталась одна проблема - через некоторое время машина перезагружается, основное подозрение - переполнение стеков потоков, так как в процессе переключения esp потока сползает всё ниже и ниже. При увеличении интервала таймера и размера стека всё это живет чуть дольше. Этой проблемы не должно быть, т.к. у каждого потока свой стек.Кстати я раньше достаточно скептически относился к использованию накладывающихся друг на друга стеков. После эксперимента, к которому ты меня подтолкнул, скепсиса стало значительно меньше. А если еще убрать копирование содержимого стека, которое я использовал для fork'а, то данный подход может стать вполне приемлемым для меня. Можно даже в локальной области потока хранить контекст FPU, отдельно отображая соответствующий буфер "хозяина FPU". |
Автор: | pavia [ 12 авг 2013, 13:02 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
У меня лично ESP никуда не ползёт. Но стек портится. Работаю в нулевом кольце. Думаю из-за этого. Диапазоны разные, но вот таймер лезет в оба диапазона. |
Автор: | phantom-84 [ 12 авг 2013, 13:10 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
Мы пока только о нулевом кольце и говорим. Последнее предложение не понял. Если речь идет о затрагивании таймерным обработчиком обоих стеков, то это вполне нормально. При переключении по таймеру таймерный обработчик начинает свою работу в контексте одного потока (оставляет кадр возобновления в его стеке), а завершает свою работу в контексте другого потока (извлекает кадр возобновления из его стека). |
Автор: | sh2ezo [ 12 авг 2013, 13:18 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
при вызове обработчика система кладет в стек адрес возврата, а также флаги. наверное, потому стек и ползет. в коде особо не разбирался, так что не кидайтесь тапками |
Автор: | pavia [ 12 авг 2013, 13:25 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
В нуливом кольце, стек прерывания не создаётся, а используется текущая вершина стека. При прерывание в любом другом кольце, создаётся новый стек. Т.е. кандидат на порчу стека это прерывание таймера. Как я говуорил ESP у меня не растёт и это легко проверяется. Пускаю 2 задачи которые просто весят в бесконечном цикле и ничего не делают. И такие задачи нормально висят не падают. А больше идей о проверки нет. |
Автор: | phantom-84 [ 12 авг 2013, 13:45 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
pavia писал(а): В нуливом кольце, стек прерывания не создаётся, а используется текущая вершина стека. Если внутри обработчика не происходит переключения, то это так. А если происходит, то см. выше, что я дописал.Цитата: При прерывание в любом другом кольце, создаётся новый стек. У меня используется текущий стек ядра, т.к. он живет постоянно, пока жив связанный с ним поток.
|
Автор: | pavia [ 12 авг 2013, 16:21 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
Это скорее всего не правильно стековый фрейм заполнил для возврата вот он тебя и отправляет чёрти куда. Код: Type StackFrame=record RetIP:Dword; EAX:DWord; DS:DWord; case integer of 0: IntStackFrame0: record EIP:DWord; CS:DWord; EFlags:DWord; end; 1: IntStackFrame3: record EIP:DWord; CS:DWord; EFlags:DWord; ESP:DWord; SS:DWord; end; end; end; Покажи код обработки прерывания что в стек кладёшь и как. |
Автор: | maisvendoo [ 12 авг 2013, 17:13 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
Вообще любое аппаратное прерывание, в том числе IRQ0, обрабатывается у меня вот так Код: /*------------------------------------------- // Общая часть обработчика IRQ //-----------------------------------------*/ .extern irq_handler irq_common_stub: pusha /* Спасаем РОН в стеке */ mov %ds, %ax /* Спасаем селектор сегмента данных */ push %eax mov $0x10, %ax /* Загружаем сегмент данных ядра */ mov %ax, %ds mov %ax, %es mov %ax, %fs mov %ax, %gs call irq_handler /* Передаем управление обработчику IRQ */ pop %ebx /* Выталкиваем из стека селектор */ mov %bx, %ds /* Восстанавливаем сегмент данных */ mov %bx, %es mov %bx, %fs mov %bx, %gs popa /* Восстанавливаем РОН */ add $8, %esp /* Убираем из стека код ошибки */ /* и помещаем туда номер ISR */ sti /* Вновь разрешаем прерывания */ iret /* Возврат из обработчика */ /* с восстановлением состояния */ /* процессора */ irq_handler - это уже написанный на С обработчик. Кажется для обработки IRQ0 при переключении задач необходимо поступать несколько иначе, я так понимаю? В нулевом кольце проталкивать нужно Код: EIP:DWord; CS:DWord; EFlags:DWord; а в user mode Код: EIP:DWord; ?
CS:DWord; EFlags:DWord; ESP:DWord; SS:DWord; |
Страница 1 из 16 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |