Лабораторная работа 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

На черный день советы от старосты четвертой группы

Главный вопрос: Опишите переход в реальный режим

  1. Устанавливаем флаг перех. в рр
  2. Запрещаем маскируемые прерывания
  3. Переходим в реальный
  4. Через команду far jmp, заданную прямо кодом, обновляем значение в теневом регистре, связанном с CS
  5. Обновляем остальные теневые регистры значениями
  6. Возвращаем маски контроллерам прерываний, возращаем значение базового вектора прерывания (8, не 32)
  7. Возвращаем базовый линейный адрес таблице векторов прерываний
  8. Разрешаем немаскируемые
  9. Разрешаем маскируемые
  10. Печатаем сообщение с помощью функций Dos
  11. Выходим через функцию DOS (ред.) Через что взаимодействуем с клавиатурой? — через порты (ред.) Что за память на экране? — доступная программе dosbox память
  • Почему делим? Потому что в мегабайтах (ред.)
  • Зачем сегмент стека в защищенном? — для использования прерываний (ред.)
  • Что происходит при загрузке селектора в сегментный регистр? — теневой регистр, связанный с сегментным регистром, обновляются значением линейного адреса сегмента