Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2018, 23:51   #1
Вопрос
 
Регистрация: 15.04.2018
Сообщений: 9
По умолчанию Прерывания при переходе в защищённый режим

Всем здрасти, во всех книгах и на форумах что я читал, написано, что перед переходом в защищённый режим необходимо запретить все прерывания, написал я переход в защищённый режим, всё норм работает, но вот незадача, только что дизассемблировал MBR linux и к моему удивлению обнаружил что там прерывания перед переходом в защищённый режим не запрещаются, удалил запрет прерываний в своём коде и он тоже работает (тестировал на bochs, QEMU и реальном железе), если ,конечно, не вызывать ни каких прерываний (но оно то и понятно), даже в long mode.

Возникает вопрос, почему везде пишут что необходимо запрещать прерывания?
На всяких случай выложил фрагмент дизассемблированного кода MBR (переход в защищённый режим)

Код:
00000000  31C0              xor ax,ax
00000002  8ED8              mov ds,ax

00000004  0F0116647C        lgdt [0x7c64]

00000009  E492              in al,0x92
0000000B  0C02              or al,0x2
0000000D  E692              out 0x92,al

0000000F  0F20C0            mov eax,cr0
00000012  0C01              or al,0x1
00000014  0F22C0            mov cr0,eax
00000017  EA1C7C0800        jmp 0x8:0x7c1c
Вопрос вне форума Ответить с цитированием
Старый 02.05.2018, 05:13   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Вопрос Посмотреть сообщение
что перед переходом в защищённый режим необходимо запретить все прерывания,
их не отключают навсегда, а обрамляют ими критические участки кода,
чтобы в это время не произошло асинхронных событий от внешних устройств:
Код:
cli
   lgdt  [0x7c64]

   in    al,92h
   or    al,2
   out   92h,al

   mov   eax,cr0
   or    al,1
   mov   cr0,eax
sti
прерывания в рм тоже обрабатываются, иначе останешься без внешних устройств.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 02.05.2018, 10:12   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Линукс это не показатель качественного кода - это помойка. Где можно найти и брильянты так и откровенное дерьмо.

Цитата:
Сообщение от Вопрос Посмотреть сообщение
Возникает вопрос, почему везде пишут что необходимо запрещать прерывания?
Если прерывание сработает в 32 битном режиме, а обработчик у тебя 16 битный, то он у тебя на первом джаме или вызове функции указатель команд убежит куда угодно но не на код. Обычно в Boch код попадает в чистую память и ещё секунд n-цать бежать. Пока не вызовет исключение. А так как прерывания при в ходе обработчик прерывания запрещаются, то исключение приведет к двойной и после тройной ошибке. Далее перезагрузка.

Цитата:
Сообщение от Вопрос Посмотреть сообщение
удалил запрет прерываний в своём коде и он тоже работает
А какая вероятность словить 1 прерывание? Возьмем Boch. Критический участок 1000 команд. Каждая команда 1 такт. 1000 тактов.
Пусть частота проца 10 000 000 Мгц.
Пусть частота срабатывания прерываний 100.
10 000 000/100=100 000 тактов до 1 прерывания
Вероятность поймать прерывания в критическом участке
100 000/1000=100
При 100 включениях вы поймаете прерывание только с вероятностью 1/100.


Цитата:
Сообщение от Вопрос Посмотреть сообщение
защищённый режим не запрещаются, удалил запрет прерываний в своём коде и он тоже работает (тестировал на bochs, QEMU и реальном железе),
Во-первых. Прохождение теста не означает отсутствие ошибок.
Во-вторых. Компьютер это детерминированная машина. Это значит что в нём отсутствует элемент случайности. А без элемента случайности теория статистика не будет работать.
Вы можете хоть 1 000 000 раз включить и выключить компьютер, но он будет работать бессбойно.
Но стоит поменять вводные(параметры) как код и процессор начинает работать по другим веткам условий, как программных так и аппаратных.
К примеру вы можете взять 100 различных компьютеров с различными биосами и один из них точно не включится из-за бага в загрузчике линукса. А стольные 99 так и не заметят его.
Или как у меня загрузчик запускался по нажатию клавиши. Это вносит случайность. Как результат прерывание таймер приходится на случайную команду.

Почему в манах интела не запрещают прерывания?
1) Это упрощённый пример. Там много чего нету.
2) Обработчик прерывания можно написать гибридный для 16 и 32 битного кода. Вот только разработчики биоса этим не занимаются. - так как проще в загрузчике написать пару команд которые защищают от данной проблемы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 02.05.2018, 12:27   #4
Вопрос
 
Регистрация: 15.04.2018
Сообщений: 9
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
их не отключают навсегда, а обрамляют ими критические участки кода,
чтобы в это время не произошло асинхронных событий от внешних устройств:
Код:
cli
   lgdt  [0x7c64]

   in    al,92h
   or    al,2
   out   92h,al

   mov   eax,cr0
   or    al,1
   mov   cr0,eax
sti
прерывания в рм тоже обрабатываются, иначе останешься без внешних устройств.
Вы меня немного не правильно поняли, оно то понятно, что в PM прерывания обрабатываются, а так же и то, что после выключения прерываний, их надо включить. Вопрос заключается лишь в том, почему требуется выключать прерывания при переходе в защищённый режим
Вопрос вне форума Ответить с цитированием
Старый 02.05.2018, 13:42   #5
Вопрос
 
Регистрация: 15.04.2018
Сообщений: 9
По умолчанию

Pavia, спасибо, теперь всё ясно, а то я уже было запутался
Вопрос вне форума Ответить с цитированием
Старый 02.05.2018, 13:59   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Вопрос Посмотреть сообщение
почему требуется выключать прерывания при переходе в защищённый режим
Если до перехода в пм ты создал таблицу прерываний IDT, и положил в неё дескрипторы обработчиков, то выключать прерывания не нужно. В противном случае, при первом-же прерывании проц сгенерит исключение, т.к. не будет знать, кому передать управление для обработки этого прерывания.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не переходит в защищённый режим Nikolay2015 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 09.12.2017 17:22
Защищённый режим процессора BVOG Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 18 21.03.2012 17:42
Выбор в листе при переходе Ghennadiy PHP 25 25.12.2010 13:30
черный экран при переходе из текстового в графический режим Yfltymrf Паскаль, Turbo Pascal, PascalABC.NET 1 27.04.2010 23:24
Refresh при переходе на страницу nikleb JavaScript, Ajax 8 20.12.2007 18:24