Лабораторная работа 02. Ёбаный пиздец. - chrislvt/OS GitHub Wiki
Любой вопрос, связанный с атрибутами
Первый атрибут (пятый байт дескриптора)
Бит P (present) - бит присутствия. Представлен ли сегмент в памяти.
Биты DPL - уровень привилегий дескриптора. Компьютеры на базе процессоров Intel поддерживают 4 кольца защиты. 0 - уровень привелегий ядра системы. 1-2 не используются в винде и линуксе. 3 - уровень привелегий пользователя приложений.
Бит S (system) 0 - описывает сегментный объект, 1 - описывает сегмент.
Три бита типа:
- Первый бит = 0 => сегмент либо данных либо стека, если 1 => сегмент кода.
- Второй бит. Если первый бит равен 0, то 0 - сегмент данных, 1 - сегмент стека. Если первый бит равен 1, то 0 подчиненный сегмент кода, 1 - обычный сегмент кода.
- Третий бит read/write. Если сегмент данных или стека то 0 - модификация запрещена, 1 - разрешена. Если сегмент кода - 0 то чтение запрещено (но не касательно выборки команд).
Бит A - доступ к сегменту (устанавливается автоматически).
Второй атрпибут
Бит G - бит дробности или гранулярности. если установлен в 1 то память меряется в блоках по 4 Кбайта, иначе в байтах.
Бит D (digit) определяет разрядность сегмента. 1 - 32разрядный, 0 - 16разрядный.
5 и 4 биты это резерв.
0 1 2 3 это limit.
Другие вопросы
Про первый МБайт памяти
- Почему мы не можем использовать первый мегабайт памяти?
В первом мегабайте хранится операционная система ROM BIOS.
- Что будет если мы попытаемся обратиться в него?
Это зона ROM - read only memory. Если попытаться что-то в него записать, то возникнет ошибка.
Про теневые регистры
- Зачем нужны?
Теневые регистры находятся в процессоре. Нужны чтоб исключить постоянные обращения к физической памяти. Тк мы обращаемся к физ. памяти на каждой команде, а то и несколько раз, особенно если адресация косвенная
Про FFFF
- Нужны ли 0FFFFh? Работает ли без этого?
так что... комментишь это дело. запускаешь. потом бьешь ноутом с этим делом ей по лбу и орешь на ухо "РАБОТАЕТ"
после чего ее в больницу, тебя в психушку, а все остальные счастливы
Они не нужны так как не нужно т к не выходим за 1МБ
Что нужно для расширения лабораторной
Что нужно сделать перед переходом в реальным режим?
Обновить сегментные регистры (перепрограммировать контроллер прерываний)
Сбросить флаг PE (нулевой бит управляющего регистра CR0)
Разрешить аппаратные прерывания и немаскируемые
Вторая часть лабораторной работы
Какие вы сегменты описали и для чего?
Мы описали:
- 32-разрядный сегмент данных, чтобы посчитать доступную память;
- 32-разрядный сегмент кода для защищенного режима;
- 16-разрядный сегмент данных, там можно строки для вывода в реальном режиме хранить;
- 16-разрядный сегмент кода для реального режима;
- 32-разрядный сегмент стека.
С помощью какой функции выводили строку в реальном режиме
Имеется введу следующий момент:
mov ah, 09h
mov edx, offser msg_real_mode
in 21h
Для вывода сообщения используется 9 функция 21 прерывания.
Что делали с базовым вектором при переходе в защищенный режим и обратно?
В реальном режиме наш базовый вектор 8, в защищенном 32, при переходе в другой режим мы перепрограммируем контроллер прерываний.
Каким образом мы перепрограммируем контроллер прерываний?
Мы смещаем базовый вектор контроллера прерываний на 32.
;Перепрограммируем ведущий контроллер прерываний
mov AL, 11h
out 20h, AL
;Тут мы его перепрограммируем
mov AL, 20h
out 21h, AL
mov Al, 4
out 21h, AL
mov AL, 1
out 21h, AL
Почему надо перепрограммировать контроллер прерываний?
Потому что теперь прерывания имеют базовый вектор не 8, а 32.
Что за размер памяти выводится в консоли?
Сколько адресного пространства выделено под dosbox.
Перед лабораторной обычно нужно ручками выделить dosbox 32 мегабайта). Число 20 - это 32 в шестнадцатеричной системе.
Показать обработчик клавиатуры
Начинается с этих строк:
keyboard_handler:
push EAX
push EBX
push ES
;Чтение скан-код нажатой клавиши из порта клавиатуры
in AL, 60h
...
...
... и так далее
Что этот обработчик анализирует?
Скан коды, приходящие с клавиатуры.
Когда вызывается?
Вызывается при нажатии или отжатии кнопки на клавиатуре.
Показать дескрипторы прерываний
Воть:
;Таблица дескрипторов прерываний
idt label byte
; ПРОПУСКАЕМ 32 ИСКЛЮЧЕНИЯ И ПЕРЕХОДИМ ИМЕННО К ПРОЦЕССОРНЫМ
trap1 intdesc 13 dup (<,sel_code32,,8fh>)
trap13 intdesc <0, sel_code32,,8fh> ;Исключение общей защиты
trap2 intdesc 18 dup (<,sel_code32,,8fh>)
timer intdesc <,sel_code32,,8eh> ;Дескриптор прерывания от таймера
keyboard intdesc <,sel_code32,,8eh>
В чем особенность 32разрядного сегмента данных?
4 гига
- для чего? Для того, чтобы посчитать память
Цитата: Имя изменено Иван Андреевич Коваленко: Я ей ответил, что для того, чтобы считать свободную память Она минуты 2 что-то говорила потом Я кивал
Куруш ничего не знает и дельного не сказал.
В попытках выяснить ответ на вопрос, я обратилась к Никите Зуеву. Погуляв в собственном сознании, он переслал цитату имя изменено Ивана Андреевича Коваленко:
"Основной ответ - размер 4 гб Показываешь ей 5 эфок И говоришь про бит гранулярнсти и дигит"
я так понимаю имелась ввиду запись в таблице дескрипторов gdt_4gb segdesc<0ffffh,,,92h,0cfh>.
Староста второй группы заявил следующее (дословно):
"Ну есть особенность, что там, например, offset чего-то будет не 2, а 4 байта. И с циклами будет работать не CX, а ECX".
Староста четвертой группы утверждает (дословно):
"У него установлен максимальный лимит
И бит гранулярности
Это значит, что память будет считаться не в байтах, а в страницах по 4Кб
Т.е. лимит * 4096
При максимальном лимите это и будет до 4Гб"
Я переслала Курушу все эти ответы, он кивнул и сказал ок, не уточнив при этом, какой из них подходящий.
Немного про линию А20
В защищенном режиме определяют порт линии А20 - 21-ая адресная линия. Компьютер стартует в реальном режиме. Связано это со стремлением хранить в энергонезависимой микросхеме ... (предполагаю что тут "как можно меньший объем информации"). ОС - программа, и пока компьютер выключен, она хранится во внешней памяти.
Когда компьютер стартует, линия А20 принудительно обнулена. При переходе в защищенный режим нужно открыть линию А20, то есть снять заземление.
Если в реальном режиме открыть линию А20, то в реальном режиме станет доступно еще 64 Кбайта памяти - HMA, high memory area.
Зачем мы открываем линию А20?
Открываем, чтобы получить все адреса. Иначе у нас недоступны любые адреса, имеющие в 20 бите 1 - она обращается в ноль (линия заземлена, любой сигнал ноль)
Что будет, если при переходе в защищенный режим не откроем линию А20?
Нам не доступны адреса, в которых 20-ая адресная линия 1.
Можно ли её не закрывать при переходе в реальный режим?
Ничего страшного не произойдет, если мы так сделаем.
Открытие линии а20:
mov AL, 0D1h
out 64h, AL
mov AL, 0dfh
out 60h, AL
Пальцем показать, где в программе устанавливается нулевой уровень привелегий в двух местах
Пуньк!
У РФ при возвр-им (абракадабра какаято) 4Г. Это нужно? Почему?
Пуньк!
Для 13 исключения должна быть специальная заглушка
Это исключение общей защиты.
;Заглушка для 13 исключения
exc13 proc
pop EAX
pop EAX
msg_output msg_trap13, msg_trap13_size, 5, 0
num_output AX, 5, 30
shr EAX, 16
num_output AX, 5, 28
iretd
exc13 endp
Для чего мы описываем сегмент 5F с битом гранулярность 1?
fffff - это лимит (4Гб). 4 в лимите + пятая во втором аргументе.
Описываем, чтоб могли 4гб при надобности измерить.
Что мы можем использовать в своем обработчике прерываний от клавиатуры?
Только порты, так как мы работаем с голым железом
Когда вызывается наш обработчик прерывания от системного таймера?
По тику (18.2 раза в секунду)
В каком режиме мы в сегментные регистры записываем селекторы и для чего?
В защищенном. Что происходит при загрузке селектора в сегментный регистр? — теневой регистр, связанный с сегментным регистром, обновляются значением линейного адреса сегмента
Что мы делаем с масками прерываний?
Маски - перед переходом в защищенный режим у контроллера ведущего и ведомого есть свои маски. Мы их сохраняем, чтоб потом восстановить. Мы их сохраняем, потому что мы ставим свои - теряем информацию о том что было. Потом их надо вернуть.
Ставим маски:
in al, 21h
mov master, AL
in al, 0A1h
mov slavem, al
Восстанавливаем маски:
mov AL, master
out 21h, AL
mov AL, slave
out 0A1h, AL
Вопросы от ДиМыКуЛиКоВа
Почему памяти столько ? (16Мб)
Потому, что кто-то забыл выделить досбоксу еще 16 мегабайт
Потому что столько физического адресного пространства выделил досбокс
Покажите в коде IDT и GDT
Показывает на дескриптор с лимитом 5f и говорит покажите здесь бит гранулярности и бит D. Зачем нужен этот дескриптор и почему 4гб?
Нужен для подсчёта памяти, а 4гб потому что Макс возможная памяти в 32р
Покажите исключения (заглушки)
Расскажите про то как считаем память , почему пропускаем 1Мб?
Потому что в 1 мб лежит ROM BIOS и мы его перезаписываем и происходит ошибка прав доступа. По-моему она говорила ROM Bios
См. выше про 1 Мб
Как работает обработчики таймер и Клава когда вызывается
См. выше
Что используется в обработчике клавы?
Порты
См. выше
Какую программу я написал ?
0 привелегий
где в двух местах говорится что у нас 0 уровня привелегии
DPL и Rpl
Где находится rpl ?
В селекторе.
Рассказать про переход из защищённого в реальный
перепрограммировать контроллер прерывания при переходе с реального на защищённый че делаем с вектором
Была 8 перезаписываем на 32
На черный день советы от старосты четвертой группы
Главный вопрос: Опишите переход в реальный режим
- Устанавливаем флаг перех. в рр
- Запрещаем маскируемые прерывания
- Переходим в реальный
- Через команду far jmp, заданную прямо кодом, обновляем значение в теневом регистре, связанном с CS
- Обновляем остальные теневые регистры значениями
- Возвращаем маски контроллерам прерываний, возращаем значение базового вектора прерывания (8, не 32)
- Возвращаем базовый линейный адрес таблице векторов прерываний
- Разрешаем немаскируемые
- Разрешаем маскируемые
- Печатаем сообщение с помощью функций Dos
- Выходим через функцию DOS (ред.) Через что взаимодействуем с клавиатурой? — через порты (ред.) Что за память на экране? — доступная программе dosbox память
- Почему делим? Потому что в мегабайтах (ред.)
- Зачем сегмент стека в защищенном? — для использования прерываний (ред.)
- Что происходит при загрузке селектора в сегментный регистр? — теневой регистр, связанный с сегментным регистром, обновляются значением линейного адреса сегмента