![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 15.04.2018
Сообщений: 9
|
![]()
Всем здрасти, во всех книгах и на форумах что я читал, написано, что перед переходом в защищённый режим необходимо запретить все прерывания, написал я переход в защищённый режим, всё норм работает, но вот незадача, только что дизассемблировал MBR linux и к моему удивлению обнаружил что там прерывания перед переходом в защищённый режим не запрещаются, удалил запрет прерываний в своём коде и он тоже работает (тестировал на bochs, QEMU и реальном железе), если ,конечно, не вызывать ни каких прерываний (но оно то и понятно), даже в long mode.
Возникает вопрос, почему везде пишут что необходимо запрещать прерывания? На всяких случай выложил фрагмент дизассемблированного кода MBR (переход в защищённый режим) Код:
|
![]() |
![]() |
![]() |
#2 | |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]() Цитата:
чтобы в это время не произошло асинхронных событий от внешних устройств: Код:
Нашедшего выход - затаптывают первым..
|
|
![]() |
![]() |
![]() |
#3 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Линукс это не показатель качественного кода - это помойка. Где можно найти и брильянты так и откровенное дерьмо.
Цитата:
А какая вероятность словить 1 прерывание? Возьмем Boch. Критический участок 1000 команд. Каждая команда 1 такт. 1000 тактов. Пусть частота проца 10 000 000 Мгц. Пусть частота срабатывания прерываний 100. 10 000 000/100=100 000 тактов до 1 прерывания Вероятность поймать прерывания в критическом участке 100 000/1000=100 При 100 включениях вы поймаете прерывание только с вероятностью 1/100. Цитата:
Во-вторых. Компьютер это детерминированная машина. Это значит что в нём отсутствует элемент случайности. А без элемента случайности теория статистика не будет работать. Вы можете хоть 1 000 000 раз включить и выключить компьютер, но он будет работать бессбойно. Но стоит поменять вводные(параметры) как код и процессор начинает работать по другим веткам условий, как программных так и аппаратных. К примеру вы можете взять 100 различных компьютеров с различными биосами и один из них точно не включится из-за бага в загрузчике линукса. А стольные 99 так и не заметят его. Или как у меня загрузчик запускался по нажатию клавиши. Это вносит случайность. Как результат прерывание таймер приходится на случайную команду. Почему в манах интела не запрещают прерывания? 1) Это упрощённый пример. Там много чего нету. 2) Обработчик прерывания можно написать гибридный для 16 и 32 битного кода. Вот только разработчики биоса этим не занимаются. - так как проще в загрузчике написать пару команд которые защищают от данной проблемы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
||
![]() |
![]() |
![]() |
#4 | |
Регистрация: 15.04.2018
Сообщений: 9
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#5 |
Регистрация: 15.04.2018
Сообщений: 9
|
![]()
Pavia, спасибо, теперь всё ясно, а то я уже было запутался
|
![]() |
![]() |
![]() |
#6 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
Если до перехода в пм ты создал таблицу прерываний IDT, и положил в неё дескрипторы обработчиков, то выключать прерывания не нужно. В противном случае, при первом-же прерывании проц сгенерит исключение, т.к. не будет знать, кому передать управление для обработки этого прерывания.
Нашедшего выход - затаптывают первым..
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Не переходит в защищённый режим | 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 |