OSDev

для всех
Текущее время: 18 апр 2024, 23:45

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




Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Прерывания, стек, защита
СообщениеДобавлено: 29 ноя 2012, 12:30 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
Решая проблему защиты и разбирая работу прерывания и переключения стека у объектов натолкнулся на такую фишку. При входе в прерывание процессор записывает (ss, esp), flg, cs, eip, нам нужно в прерывании поменять стек, выполнить работу в стеке объекта, который должен сделать реакцию(он её сделает, когда освободится процессор и просмотрит приросты стека в кольце задач).
Дополнительно сохраняю регистры и ВАП (ss, esp), flg, cs, eip, eax, ecx, edx, ebx, ebp, esi, edi, 1, cr3
но проверяю уровень защиты cs, т.к. отрабатываю тока в одном 0 кольце и ещё может быть вызвано первый раз с 0 cs, хотя не знаю почаму, но вешает если балуешся со стеками ещё не созданных объектов.
Код:
cmp word[esp+4],8h      ;если мы не в cs = 8h то выход
jnz .1
push eax ebx ecx edx ebp esi edi
mov eax,cr3
push eax
mov eax,2000h
mov cr3,eax
mov eax,1
push eax

код смены стека и выполнения процессорного объекта этого прерывания

   mov eax,2000h
   mov cr3,eax
   mov dword [APIC_EOI_REG_DEF],0 ;EOI
   add esp,4
   pop eax
   mov cr3,eax
   pop edi esi ebp edx ecx ebx eax
.1:iretd


Работу в прерывании виду в стеке процессора и объектом процессора(если объект мыши на прерывании 1 процессора, то объект процессора является задачей процессора, т.к. выполняться будет тока им)

Короче фишке в том, что если я добавляю в стек объекта который был прерван и у которого в стеке уже flg, cs, eip, eax, ecx, edx, ebx, ebp, esi, edi, 1, cr3, то я делаю имитацию этого всего, но в eip функция вызываемая, а в регистрах инфа для неё, т.о. процессор перейдёт на эту функцию, а выполнив это всё перейдёт дальше по стеку, там прошлая остановка, и всё это без просмотра кольца задач.


Кстати есть фишка, что если выйти из прерывания не iretd, а без возврата cs то вся защита и рухнет, но работать будет нормально
cmp word[esp+4],8h
jnz @f
add esp,8
popfd
jmp dword[esp-12]
@@:

Вообще рекомендуют читать таненбаума, он рассказывает несколько способов отложенной обработки прерываний в разных режимах, ктонить читал?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания, стек, защита
СообщениеДобавлено: 02 дек 2012, 06:26 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
Изменил немного сборку в стеке для прерывания задачи, запуска задачи и усыпления задачи: flg, cs, eip, eax, ecx, edx, ebx, ebp, esi, edi, cr3, esp
Варианты использования:
если запускаем задачу: flg=0, cs, eip(адрес функции), eax, ecx, edx, ebx, ebp(объект), esi, edi(адрес возврата), cr3, esp(прошлое задание)
если прерываем: flg, cs, eip(адрес возврата), eax, ecx, edx, ebx, ebp(объект), esi, edi, cr3, esp(прошлое задание)
если задача прервана, и к ней же добавлена задача:
flg=0, cs, eip(адрес функции), eax, ecx, edx, ebx, ebp(объект), esi, edi(адрес возврата), cr3, esp(прошлое задание) - задана задача и она выпоняется
работа с обнулением стека в конце и выход с обнулёным стеком
flg, cs, eip(адрес возврата), eax, ecx, edx, ebx, ebp(объект), esi, edi, cr3, esp(прошлое задание) - прервана задача
flg=0, cs, eip(адрес функции), eax, ecx, edx, ebx, ebp(объект), esi, edi(адрес возврата), cr3, esp(прошлое задание) - задача после которой возобновится
работа с обнулением стека в конце и выход на восстановление прошлой
прервынная работа

Запуск из просмотра прироста к стеку:
Код:
      pop edi esi ebp edx ecx ebx eax
      cmp dword[esp+8],0      ;если запуск а не восстановление
      jnz .0
         add esp,12
         jmp dword[esp-12]
.0:      add esp,8
                popfd
                jmp dword[esp-12]

Запуск из прерывания:
Код:
   mov eax,[ebp+68]
   add esp,4
   ;pop eax
   mov cr3,eax
   pop edi esi ebp edx ecx ebx eax
   cmp dword[esp+8],0      ;если перед восстановлением добавили задачу
   jnz .1
      mov edi,[flg]
      mov [esp+12],edi
.1:   iretd


При возникновении прерывания процессор запрещает прерывания if, а iretd разрешает


Цель реализации работы объектов в своём стеке и многозадачности:
1 Запускать задачи из своего стека
2 Усыплять задачи
3 Переключать задачи
4 Останавливать задачи
5 Добавлять задачу к имеющейся


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 2 ] 

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


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

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


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

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