Лабораторный практикум дополняет лекционный курс Операционных систем, давая студентам навыки системного программирования в операционной среде DOS.
перед началом выполнения работы студент должен узнать у преподавателя свой вариант задания;
программа должна быть представлена в исходных файлах на языке Pascal или C/C++, допускаются ассемблерные вставки;
исходные файлы должны содержать достаточный комментарий, а именно: каждый файл должен начинаться с шапки, поясняющей назначение файла, каждая подпрограмма и каждая глобальная переменная должны сопровождаться объяснением их назначения;
в момент сдачи программа должна быть успешно откомпилирована и запущена;
если это требуется, то должны быть предоставлены несколько (не менее 5) файлов-примеров для демонстрации их обработки программой;
студент дожен вкратце пояснить структуру исходного текста программы и процесс ее выполнения;
студент должен ответить на всевозможные вопросы как по исходному тексту программы, так и по ее работе;
программа должна быть сделана и сдана в сроки оговоренные преподавателем;
В случае возникновения сомнений, неопределенностей, дилемм, касающихся задания работы студенту надлежит попытаться выполнить следующие действия (именно в таком порядке):
Изучить литературу по предмету (включая конспект лекций) и, таким образом, яснее представить свое задание.
Реализовать все возможные варианты решения (если возник вопрос типа “справа или слева”, то сделать и справа, и слева).
Обратиться за разъяснениями к преподавателю (если пункты 1. и 2. не помогли).
В рамках лабораторной работы “Адресация памяти в ОС семейства 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 |
В этой работе требуется дополнить функциональность программы, написанной в рамках двух предыдущих работ. Программа должна давать возможность выбрать текстовый файл из имеющихся на диске и выполнять над этим файлом некоторые действия. Все файловые операции должны быть выполнены через обращение к сервисам DOS, а именно посредством программного прерывания 21h.
Программа должна соответствовать всем требованиям первой и второй лабораторных работ.
Программа должна предоставлять возможность выбирать любой текстовый файл на любом из дисков.
Выбор файла и смена подкаталога или диска должны быть выполнены в виде меню.
Перемещение по меню должно выполняться клавишами со стрелочками.
Программа должна отображать в меню только файлы с расширением txt и подкаталоги.
Сразу после выбора файла программа должна выполнить с этим файлом действия, указанные в варианте задания.
Полученный в результате обработки файл программа должна сохранить в файле с таким же именем как у исходного, но с другим расширением (например xtx).
Выбор и обработка файла может выполняться многократно без перезапуска программы.
Все действия с файловой системой должны выполняться путем вызова соответствующих функций программного прерывания 21h.
Для всех действий с файловой системой должен выполняться тщательный контроль над ошибками. В случае регистрации ошибки при работе с файловой системой программа должна вывести на экран соответствующее текстовое сообщение и попытаться выполнить свою работу снова.
В большинстве функций прерывания 21h признаком ошибки служит установленный флаг переноса CF (младший бит регистра флагов FLAGS). При этом в регистр AX помещается код ошибки (зачастую вместо файлового индекса, помещаемого в случае безошибочной работы). Проверка наличия ошибки по значению регистра AX будет считаться признаком неверно выполненной работы. За более детальным описанем работы функций файловой подсистемы DOS следует обращаться к книге Фроловых.
Отсутствие файлов-примеров подобранных для наглядной демонстрации их обработки программой будет считаться неготовностью к сдаче работы.
Удалить гласные, первые буквы сделать заглавными, удалить пробелы.
Перевернуть некоторые (выбранные случайным образом) слова задом на перед.
Добавить в конец файла статистику вхождений слов (например: папа – 43 раза, мама – 77 раз).
Поменять местами соседние слова (в парах, выбранных случайным образом).
Сделать первую букву в слове - строчной, остальные – прописными.
Добавить в конец файла статистику вхождений букв (например: п – 443 раза, м – 477 раз).
Заменить некоторые (выбранные случайным образом) гласные.
Удалить слова короче 3 символов.
Удалить слова, начинающиеся с прописной буквы.
Произвести транслитерацию (замену букв кириллицы аналогами из латиницы).
Закодировать символы в формате /ссс, где ссс - код символа.
Сдвинуть пробелы на выбранное случайным образом небольшое количество позиций (от 1 до 3).
Заменить некоторые (выбранные случайным образом) буквы "р" на "л".
Зашифровать текст при помощи операции ХOR.
Сократить все слова до 3 символов и добавить точки.
Заменить некоторые (выбранные случайным образом) слова многоточиями.
Поменять местами некоторые (выбранные случайным образом) соседние буквы.
Удалить некоторые (выбранные случайным образом) пробелы.
Случайным образом заменить все знаки препинания на другие.
Заменить знаки препинания на соответствующие слова
Между некоторыми (выбранными случайным образом) словами вставить слово "ну", взятое в запятые.
Заменить некоторые (выбранные случайным образом) согласные на другие.
Поставить после некоторых (выбранных случайным образом) слов комбинацию символов :) (смайлик).
Удалить некоторые (выбранные случайным образом) гласные.
Удалить некоторые (выбранные случайным образом) согласные.
Некоторые (выбранные случайным образом) слова повторить дважды.
В конец некоторых (выбранные случайным образом) слов добавить выбранную случайным образом гласную.
В этой работе нужно добавить к полученной в прошлых работах программе возможность выполнять некоторые действия с секторами гибкого магнитного диска. Посекторная работа с диском выполняется через функции программного прерывания 13h.
Программа должна соответствовать всем требованиям первых трех лабораторных работ.
Программа должна вывести на экран следующие параметры гибкого диска: количество головок, количество дорожек, количество секторов на дорожке, общее количество секторов на диске, размер сектора в байтах.
Программа должна неоднократно выполнять действия варианта задания.
Сектора следует указывать как их физическими координатами, так и абсолютным номером (формулу свертки координат в абсолютный номер выбрать самостоятельно).
Все действия над секторами гибких магнитных дисков следует выполнять через функции программного прерывания 13h.
Отсутствие файлов-примеров подобранных для наглядной демонстрации их обработки программой а также отформатированной дискеты, содержащей несколько файлов будет считаться неготовностью к сдаче работы.
Повторное выполнение действий варианта задания должно приводить носитель к исходному состоянию.
Везде, где упоминается использование файла, подразумевается, что он лежит на жестком диске. Если имя файла генерируется автоматически, то он должен размещаться в той же директории, что и программа. В противном случае процедура выбора файла заимствуется из третьей работы.
Записать на гибкий диск содержимое указанного текстового файла побайтно, начиная с указанного сектора. При этом замещенное содержимое секторов сохранить в другом файле также побайтно.
Записать на гибкий диск содержимое указанного текстового файла побайтно в обратном порядке, начиная с указанного сектора. При этом замещенное содержимое секторов сохранить в другом файле так же побайтно в обратном порядке.
Записать на гибкий диск серию байт введенных с клавиатуры, начиная с произвольного сектора и с произвольного байта этого сектора. Затертые байты выводить на экран.
Поменять местами содержимое секторов гибкого диска. Порядок замены ввести с клавиатуры в виде циклической перестановки (например “1 43 23”, то есть первый сектор записать вместо сорок третьего, сорок третий вместо двадцать третьего, а двадцать третий вместо первого).
Закодировать указанные сектора гибкого диска логической бинарной операцией XOR (логическое исключающее ИЛИ). В качестве второго операнда взять содержимое указанного некодируемого сектора этого же гибкого диска.
Закодировать указанные сектора гибкого диска логической бинарной операцией XOR (логическое исключающее ИЛИ). В качестве второго операнда взять текст введенный с клавиатуры.
Закодировать указанные сектора гибкого диска логической бинарной операцией XOR (логическое исключающее ИЛИ). В качестве второго операнда взять содержимое указанного файла.
Записать содержимое произвольных секторов гибкого диска в те же сектора с обратным порядком следования байт в секторе.
Указанные сектора гибкого диска сохранить на жестком диске в файлах с автоматически сгенерированными именами, при этом имена файлов сохранить в соответствующих секторах. Выполнить обратную операцию по восстановлению секторов из файлов.
Указанные сектора гибкого диска сохранить на жестком диске в файлах с именами, сгенерированными автоматически из физических координат соответствующего сектора, при этом сами сектора заполнить нулями. Выполнить обратную операцию по восстановлению секторов из файлов.
Записать содержимое указанных секторов гибкого диска в те же сектора, но с переставленными байтами в секторе. Перестановка байт вводится из файла. Кроме того реализуется обратная перестановка.
Записать содержимое указанных секторов гибкого диска в те же сектора, но с переставленными байтами в секторе. Перестановка байт соответствует порядку возрастания значения байт произвольного сектора. Кроме того реализуется обратная перестановка.
Записать содержимое произвольных секторов гибкого диска в те же сектора, но с обратным порядком следования байт в сериях по 2N байт. N = 2..8.
Записать содержимое произвольных секторов гибкого диска в те же сектора, но с обратным порядком следования серий по 2N байт. N = 2..8.
Заменить во всех указанных секторах гибкого диска все вхождения некоторой указанной серии байт на другую указанную той же длины. При этом следует проверить, чтобы изначально первая из этих серий точно содержалась, а вторая точно не содержалась в этих секторах.
Заменить в указанных секторах гибкого диска значения байт по таблице замены, содержащейся в указанном пользователем файле. Таблица состоит из нескольких строк типа <исходное значение байта> => <итоговое значение байта>, образующих цикл.
В указанной паре секторов гибкого диска поменять местами все соответствующие четные байты.
В указанной паре секторов гибкого диска поменять местами все соответствующие четные биты.
Сохранить указанные сектора гибкого диска в один файл с указанным именем, при этом сами сектора заполнить случайными байтами. Восстановить сектора дискеты из файла.
Циклически сдвинуть на указанное количество позиций содержимое произвольного диапазона (подряд идущих) секторов гибкого диска.
Циклически сдвинуть на указанное количество позиций байты нескольких указанных секторов гибкого диска.
Заменить все байты указанных секторов гибкого диска со значениями, соответствующими кодам букв латинского алфавита на значения соответствующие тем же буквам, но в другом регистре (сменить регистр латинских букв).
Заменить все байты указанных секторов гибкого диска со значениями, соответствующими кодам цифр на значения соответствующие цифрам полученным из исходных по формуле D2:=9-D1, где D1 – исходная цифра, D2 – итоговая цифра.
Циклически сдвинуть в указанных секторах гибкого диска на указанное число позиций все байты указанного диапазона.
Циклически сдвинуть в указанных секторах гибкого диска на указанное число позиций все байты по указанной маске.
Закодировать операцией XOR (логическое исключающее или) в указанных секторах гибкого диска все байты указанного диапазона. В качестве второго операнда взять текстовую строку введенную с клавиатуры.
Закодировать операцией XOR (логическое исключающее или) в указанных секторах гибкого диска все байты по указанной маске. В качестве второго операнда взять текстовую строку введенную с клавиатуры.