Лабораторный практикум дополняет лекционный курс Операционных систем, давая студентам навыки системного программирования в операционной среде DOS.
перед началом выполнения работы студент должен узнать у преподавателя свой вариант задания;
программа должна быть представлена в исходных файлах на языке Pascal или C/C++, допускаются ассемблерные вставки;
исходные файлы должны содержать достаточный комментарий, а именно: каждый файл должен начинаться с шапки, поясняющей назначение файла, каждая подпрограмма и каждая глобальная переменная должны сопровождаться объяснением их назначения;
в момент сдачи программа должна быть успешно откомпилирована и запущена;
студент дожен вкратце пояснить структуру исходного текста программы и процесс ее выполнения;
студент должен ответить на всевозможные вопросы как по исходному тексту программы, так и по ее работе;
программа должна быть сделана и сдана в сроки оговоренные преподавателем;
В рамках лабораторной работы “Адресация памяти в ОС семейства DOS” требуется создать DOS-программу для просмотра фрагментов содержимого оперативной памяти. Основная цель работы – научиться эффективно пользоваться четырехбайтными адресами реального режима процессоров i80x86.
программа использует текстовый режим работы монитора;
весь вывод на экран производится посредством прямой записи в видеопамять (в диапазон памяти адаптера CGA – сегмент $b800);
программа выполняется в окне. Это окно исчезает после ее исполнения, при этом восстанавливается исходное содержимое экрана;
окно состоит из двух полей: поля просмотра фрагмента содержимого памяти и поля ввода базового адреса;
после нажатия на ключевую комбинацию клавиш (например клавиша 'Ins' для сегментной части адреса и клавиша 'Del' для смещения) программа позволяет ввести базовый адрес (с которого начинается отображаемый диапазон);
нажатие на стрелки вверх и вниз вызывает прокрутку содержимого оперативной памяти в окне просмотра;
нажатие на клавиши 'PgUp' и 'PgDn' вызывает ускоренную прокрутку содержимого;
в окне отображения выводится несколько (не менее четырех) строк формата: <адрес> - <серия слов>;
детали ввода базового адреса и вывода дампа памяти оговариваются в вариантах.
Варианты ввода базового адреса:
Базовый адрес задается в шестнадцатиричном виде двумя компонентами: сегментом и смещением.
Базовый адрес задается в десятеричном виде двумя компонентами: сегментом и смещением.
Базовый адрес задается в шестнадцатиричном виде одним компонентом – абсолютным номером ячейки.
Базовый адрес задается в десятеричном виде одним компонентом – абсолютным номером ячейки.
Варианты вывода содержимого памяти:
Содержимое выводится в шестнадцатиричном виде сериями по 8 двухбайтовых слов.
Содержимое выводится в десятеричном виде сериями по 8 двухбайтовых слов.
Содержимое выводится в шестнадцатиричном виде сериями по 16 однобайтовых слов.
Содержимое выводится в десятеричном виде сериями по 16 однобайтовых слов.
Содержимое выводится в символьном виде сериями по 2 восьмибайтовых слова.
Содержимое выводится в символьном виде сериями по 16 однобайтовых слов.
Содержимое выводится в восьмеричном виде сериями по 8 двухбайтовых слов.
Содержимое выводится в восьмеричном виде сериями по 16 однобайтовых слов.
Механизм адресации
Для успешного выполнения работы необходимо четко представлять себе механизм адресации реального режима процессоров i80x86. Важная характеристика этого режима: использование двадцатиразрядной адресной шины и шестнадцатиразрядной шины данных. Ширина адресной шины определяет физический адрес ячейки памяти как дватцатизначное двоичное число, которое для краткости удобно записывать как пятизначное шестнадцатиричное. Например, допустимый физический адрес ячейки памяти: 0011 0101 1100 0001 0000. Двоичная запись адреса наглядно показывает какие сигналы будут направлены на проводники адресной шины. Именно с этой целью мы не опускаем незначимые нули слева. Оперировать таим адресом неудобно в силу большой длины его записи. Тот же адрес в шестнадцатиричной форме выглядит так: 35С10. Перевод чисел между двоичной и шестнадцатиричной системой в обоих направлениях упрощается возможностью выполнять его по частям: каждой серии из четырех двоичных цифр соответствует одна шестнадцатиричная цифра.
Двадцатиразрядность адресной шины ограничивает адресуемое пространство памяти одним мегабайтом, так как собственный адрес присваивается каждой однобайтовой ячейке.
Для того что бы передавать адреса по шине данных их представляют как пару двухбайтовых слов. Первое называют сегментной частью адреса или просто сегментом (segment), второе называют смещением (offset). В процессоре происходит аппаратное преобразование двухкомпонентного адреса (сегмента и смещения) в физический номер ячейки. Для двадцатиразрядной шины используется формула N = Seg*16 + Off, где N – физический номер ячейки памяти, Seg – сегментная часть адреса, Off – смещение. Число 16 из этой формулы называют также размером параграфа. Подобная схема преобразования адресов использовалась и в более поздних процессорах, при этом с увеличением разрядности адресной шины увеличивался и размер параграфа.
Обычно двухкомпонентный адрес записывается шестнадцатеричными числами через двоеточие, например адрес 4A12:0F00, соответствует физическому номеру 4B020. В силу избыточности используемого кодирования номера ячейки, одна физическая ячейка может быть адресована множеством двухкомпонентных адресов. Так ячейка 4B020 соответствует также, например, адресам 4B02:0000, 4B00:0020, 4000:B020, 4100:A020.
Множество адресов с общей сегментной частью называют сегментом памяти. Например говорят “сегмент 4B02”, подразумевая при этом ячейки с адресами в диапазоне от 4B02:0000 до 4B02:FFFF. Номера ячеек этого сегмента изменяются от 4B020 до 5B01F. Размер любого сегмента – 64 килобайта. Расстояние между начальными ячейками двух соседних сегментов равно размеру параграфа. Параграфом же называют промежутки между начальными ячейками соседних сегментов. Сегменты не являются физическими структурами, они обусловлены только двухкомпонентной схемой представления адресов. При разрядности адресной шины меньше 32, в частности при двадцатиразрядной адресной шине различные сегменты могут пересекаться.
Двухкомпонентную систему адресации используют в частности для динамического связывания объектов программы. Если группа объектов расположена внутри одного сегмента (занимает не более 64 килобайт и выровнена по параграфам), то используются так называемые ближние адреса, состоящие из одного лишь смещения внутри данного сегмента. При этом сегментная часть адреса должна находиться в одном из специальных регистров процессора. В противовес ближним полные двухкомпонентные адреса называют также дальними.
В среде Borland Pascal для обращения к памяти непосредственно по дальним адресам используют либо предопределенный массив mem, либо переменные с абсолютной адресацией описанные с использованием директивы absolute. В Borland C++ можно воспользоваться директивой препроцессора MK_FP для привязки объявляемой переменной к некоторому адресу.
Работа с видеопамятью
Из мегабайта адресного пространства DOS в оперативную память отображаются только первые 640 килобайт. Адресное пространство выше этой границы отображается в память различных устройств, таких как видеоадаптеры, ПЗУ и т.д. Кроме того некоторые диапазоны адресов верхней части адресного пространства используются драйверами расширенной (extended) и дополнительной (expanded) памяти.
Первые 4000 байта сегмента B800 отображаются в память видеоадаптера CGA. Интерфейс этого устаревшего адаптера до сих пор поддерживается видеоподсистемами как текстовый режим работы монитора. Содержимое экрана располагается в памяти построчно, при том что экран имеет 25 строк по 80 символов. На каждый символ приходится по 2 байта: сначала (с четным смещением) идет код символа по таблице ASCII, затем (с нечетным смещением) располагается так называемый атрибут символа – байт содержащий информацию о свете символа и цвете фона.
Во второй работе “Программные прерывания и структуры данных DOS” требуется на основе программы, реализованной в первой работе, создать программу, которая демонстрирует содержимое некоторых служебных структур данных DOS. Основные цели работы – научиться находить структуры данных DOS, а также пользоваться программными прерываниями для вызова сервисов DOS.
Программа должна соответствовать всем требованиям первой лабораторной работы.
Программа должна реализовать варианты 1 и 2 ввода базового адреса.
Программа должна реализовать варианты 1, 2 и 6 вывода содержимого памяти.
Программа предоставляет возможность переключать режимы вывода содержимого памяти во время работы.
По нажатию функциональных клавиш программа должна перемещаться к указанным в варианте задания структурам данных DOS и демонстрировать их содержимое.
Содержимое структур данных DOS производится как в любом из трех стандартных режимов, так и в режиме специфическом для данной структуры, то есть с интерпретацией данных в контексте их предназначения (в виде записи с именованными полями).
Программа получает информацию о расположении структур данных DOS посредством системных запросов, выполняемых через программные прерывания.
В управлении монитором наряду с прямым доступом к видеопамяти используются функции прерывания BIOS 10h. В частности через BIOS выполняется управление положением курсора.
Векторная таблица связи.
Векторная таблица прерываний и обработчики прерываний.
Блоки управления памятью (MCB) и блоки переменных среды.
Префиксы программных сегментов (PSP) и области передачи данных (DTA).
Программные модули.
Список управляющих блоков устройств.
Таблица открытых файлов.
Список загружаемых драйверов устройств.
Дисковые буферы.
В каждом варианте нужно рассмотреть две из перечисленных выше структур данных. Ниже следует распределение структур для номеров вариантов.
|
1 - 1 и 2 2 - 1 и 3 3 - 1 и 4 4 - 1 и 5 5 - 1 и 6 6 - 1 и 7 |
7 - 1 и 8 8 - 1 и 9 9 - 2 и 3 10 - 2 и 4 11 - 2 и 5 12 - 2 и 6 |
13 - 2 и 7 14 - 2 и 8 15 - 2 и 9 16 - 3 и 4 17 - 3 и 5 18 - 3 и 6 |
19 - 3 и 7 20 - 3 и 8 21 - 3 и 9 22 - 4 и 5 23 - 4 и 6 24 - 4 и 7 |
25 - 4 и 8 26 - 4 и 9 27 - 5 и 6 28 - 5 и 7 29 - 5 и 8 30 - 5 и 9 |
31 - 6 и 7 32 - 6 и 8 33 - 6 и 9 34 - 7 и 8 35 - 7 и 9 36 - 8 и 9 |