OSDev http://osdev.su/ |
|
Прерывания, стек, защита http://osdev.su/viewtopic.php?f=26&t=656 |
Страница 1 из 1 |
Автор: | Станислав [ 29 ноя 2012, 12:30 ] |
Заголовок сообщения: | Прерывания, стек, защита |
Решая проблему защиты и разбирая работу прерывания и переключения стека у объектов натолкнулся на такую фишку. При входе в прерывание процессор записывает (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] @@: Вообще рекомендуют читать таненбаума, он рассказывает несколько способов отложенной обработки прерываний в разных режимах, ктонить читал? |
Автор: | Станислав [ 02 дек 2012, 06:26 ] |
Заголовок сообщения: | Re: Прерывания, стек, защита |
Изменил немного сборку в стеке для прерывания задачи, запуска задачи и усыпления задачи: 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 Добавлять задачу к имеющейся |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |