- •Общие требования к выполнению лабораторных работ Содержание отчета
- •3. Оборудование
- •4. Задание на работу
- •3. Оборудование
- •4. Задание на работу
- •3. Оборудование
- •4. Задание на работу
- •3. Оборудование
- •4. Задание на работу
- •Страничная организация памяти
- •1. Цель работы
- •2. Краткие теоретические сведения
- •3. Оборудование
- •4. Задание на работу
- •5 Контрольные вопросы
- •Защищенный режим процессора. Обработка исключений
- •1. Цель работы
- •2. Краткие теоретические сведения
- •Защищенный режим процессора. Многозадачность
- •1. Цель работы
- •2. Краткие теоретические сведения
- •Процессы и потоки в Windows
- •1. Цель работы
- •Краткие теоретические сведения
- •Структура сервиса
- •Дополнительная
- •Периодические издания
- •Программное обеспечение и Интернет-ресурсы
3. Оборудование
4. Задание на работу
Разработать программу в соответствии с заданием, выданным преподавателем по одному из вариантов заданий к лабораторной работе.
Перечень заданий:
Установить на виртуальной машине операционную систему MS-DOS . Создать программу подсчета числа файлов в корневом каталоге диска С:.
Установить на виртуальной машине операционную систему MS-DOS . Создать программу подсчета числа каталогов в корневом каталоге диска С:.
Установить на виртуальной машине операционную систему MS-DOS . Создать программу вывода элемента каталога, соответствующего файлу A.TXT в корневом каталоге диска С:.
Установить на виртуальной машине операционную систему MS-DOS . Создать программу вывода элемента каталога, соответствующего каталогу ONE в корневом каталоге диска С:.
Контрольные вопросы
Структуры исполняемых файлов
1. Цель работы
Получить представление о процессе загрузки и настройки программ для исполнения. Ознакомиться и практически изучить структуры исполнимых файлов и методы автоматизированного преобразования исполнимых программ на уровне загрузочных модулей.
2. Краткие теоретические сведения
Загрузка программных модулей типа .COM
Отдельное место по ряду причин занимает формат программ типа .COM. Для этого формата модуля настройка по реальному адресу памяти заключается в занесении значения параграфа начального адреса программы в сегментные регистры DS, ES,SS, CS. То есть все сегментные регистры проинициализированы одним значением, которое называют базовым адресом, и, так как размер .com программы не превышает размера физического сегмента (64К), то для любой адресации нет необходимости изменять начальные значения сегментных регистров. Это и запрещено для исходных текстов будующих .com программ. Настройка указателей стека и кода производится путем занесения фиксированных величин , соответственно 0FFFEh и 0100h. Для указателя стека - это конец сегмента, для указателя кода - это первый байт за PSP.
Принципы загрузки и настройки программных модулей типа .EXE
Для программных модулей типа .EXE процесс настройки состоит из двух этапов;
- настройки сегментных адресных констант
- занесения значений адресов в сегментные регистры и регистры-указатели.
Под сегментной адресной константой будем понимать константу, сохраняющую адрес сегмента. Эти константы могут быть описаны в сегментах данных, использоваться в качестве непосредственных операндов в командах, неявно присутствовать в командах дальних переходов с прямой адресацией.
Таким образом для обеспечения перемещаемости .exe программ в памяти необходима настройка адресных констант, содержащихся в инструкциях и хранящих адреса сегментов.
Пример.
MOV AX,SEG A
В этой команде записан непосредственный операнд, значение которого равно адресу назначенного ассемблером адреса сегмента в котором находится переменная А.
Чтобы загрузчик имел возможность корректировать адресные константы, построенные на этапе трансляции, ассемблер, а затем и редактор связей формируют таблицу адресов вышеупомянутых констант. Следовательно возникает необходимость хранения в .exe файле информации о местоположении адресных констант. В программе должны быть использованы специальные средства для опубликования переменных и указания внешних имен (см. рис.1)
Модуль 1 ; опубликование переменной PUBLIC B … D segment … B DW … D ends … |
Модуль 2 ;Указание транслятору имени ;внешней переменной EXTERN B … C segment … ; использование внешней ;переменной MOV ax, B … C ends … |
Рис. 1. Описание совместно используемых переменных
В связи с тем, что в модуле типа .com нет необходимости хранить информацию о перемещаемых адресных константах, структура файлов для модулей типа .com и .exe различна и имеет вид, показанный на рис 2.
-
Файл модуля типа .com
Файл модуля типа .exe
Загрузочный образ сегмента, в котором размещены код и данные.
Заголовок файла. Здесь хранится информация о перемещаемых константах, адрес точки входа, значения регистров стека и др.
Загрузочная часть модуля. Содержит последовательность образов загрузки сегментов данных и кода.
Рис.2. Формат файлов модулей типа .com и .exe
Процесс загрузки программных модулей
Загрузку модулей в память выполняет системный загрузчик программ. В процессе загрузки выполняются следующие действия.
1) Выделяются два блока системной памяти для сегмента среды окружения и программы. В результате определяются адреса: SEG_PSP - адрес загрузки структур программы и SEG_ENV - адрес среды окружения.
2) В блок памяти окружения копируется текущее окружение DOS. В конец среды окружения добавляется ASCIIZ строка, указывающая путь загрузки программы.
3) В блоке памяти для загрузки программы, который начинается с адреса SEG_PSP заполняются поля PSP.
4) Производится загрузка и настройка программы.
Процесс загрузки и настройки .exe файла предполагает выполнение
следующих действий.
Считать в память форматированную часть заголовка (1Ch байт).
Определить размер загружаемой части.
Определение размера загружаемой части программы можно выполнить по формуле
L=(PageCnt - 1) * 512 + PartPage - HdrSize * 16
Выбрать начальный адрес для загрузки Start_Seg.
Start_Seg = Seg(PSP)
Загрузить загружаемую часть модуля с адреса Start_Seg:0000h.
Установить указатель в файле на начало таблицы перенастройки.
Для каждого элемента RT выполнить следующее:
а) прочитать его как структуру из двух слов I_OFF, I_SEG;
б) вычислить сегментный адресной константы, нуждающейся в настройке
Relo_Seg = Start_Seg +I_Seg;
в) прочитать слово по адресу (Relo_Seg:I_OFF) + Start_Seg;
г) полученное значение записать на старое место (откуда было прочитано).
После корректировки перемещаемых констант производится инициализация сегментов.
ES = DS = Seg(PSP)
CS:IP = ReloCs:EXEIP
SS:SP = ReloSS:EXESP
Когда программа получает управление, сегментные регистры инициализируются следующим образом. В регистры DS и ES заносится сегментная компонента адреса PSP.
В регистры CS:IP заносится адрес точки входа (информация из заголовка .exe файла )
В программе точка входа задается:
а) командой ассемблера END M1 (М1 это имя метки - точка входа);
б) командой ассемблера END без параметра. Тогда ReloCS=100h, EXEIP=0
Соответственно ReloSS и EXESP определяются ассемблером по характеристикам сегмента с типом STACK/
3. Оборудование
4. Задание на работу
Разработать программу в соответствии с заданием, выданным преподавателем по одному из вариантов заданий к лабораторной работе .
5. Контрольные вопросы
Защищенный режим процессора. Методы адресации и переключение режимов микропроцессора
1. Цель работы
Получить представление о схеме адресации памяти в защищенном режиме, а также практически изучить основные принципы построения программ, работающих в защищенном режиме процессора Pentium.
2. Краткие теоретические сведения
Процессор Pentium, работающий в защищенном режиме, позволяет организовывать эффективные программные системы, обладающие большой надежностью и быстродействием, благодаря реализации на аппаратном уровне мультизадачности и механизма виртуальной памяти. В этом режиме адресное пространство расширяется до 4Г, а область виртуальных адресов — до 64Т. Кроме того, в защищенном режиме имеется возможность выполнения программ, разработанных для младших моделей процессоров с одновременным доступом ко всей памяти и применением аппарате поддерживаемых средств защиты. Защищенный режим позволяет использовать дополнительные команды, специально оптимизированные для многозадачных операционных систем. Основное отличие реального режима от защищенного состоит в расширении адресного пространства и использовании других механизмов адресации.
Как и в реальном режиме, в защищенном режиме используется два компонента для формирования логического адреса:
16-битовый селектор, для определения адреса базы сегмента;
32-битовый эффективный адрес.
Значение базы сегмента складывается с эффективным адресом, после чего получается 32-битовое значение логического адреса. Если не используется механизм страничной адресации, то этот логический адрес является и физическим адресом, в противном случае он преобразуется в физический.
Селектор в защищенном режиме используется не так, как в реальном. Значение селектора должно рассматриваться операционной системой в качестве индекса, указывающего на определенный элемент специальной таблицы, содержащей 32-битовый базовый адрес данного сегмента. Физический адрес формируется сложением базового адреса, полученного из таблицы, со смещением.
Страничная адресация является дополнительным механизмом управления памятью, доступным только в защищенном режиме. Этот механизм позволяет преобразовывать исполнительные адреса в физические.
Сегментация — это один из методов управления памятью, на котором основывается механизм защиты. Сегменты — самостоятельные области памяти, имеющие собственные атрибуты. Например, в сегменте может размещаться код программы или таблицы ОС. Вся информация о сегменте запоминается в специальной структуре, называемой дескриптором.
Дескрипторы, используются аппаратно и не доступны из программ.
Таблицы дескрипторов определяют все сегменты, которые используются процессором Pentium. К этим таблицам относятся:
GDT (Global Descriptors Table) — таблица глобальных дескрипторов;
LDT (Local Descriptors Table) — таблица локальных дескрипторов;
IDT (Interrupt Descriptors Table) — таблица дескрипторов прерываний.
Каждая из таблиц хранится в своей области памяти и имеет размер от 8 байт до 64К. Таким образом, каждая таблица может содержать от 1 до 8К восьмибайтных дескрипторов. Старшие 13 битов селектора используются в качестве индекса соответствующей таблицы дескрипторов.
Для обращения к таблицам дескрипторов применяются специальные регистры, хранящие 32-битовый линейный базовый адрес и 16-битовую границу данной таблицы - GDTR, LDTR и IDTR. Команды LGDT, LLDT и LIDT загружают базу и предел соответствующих таблиц в связанные с ними регистры. Команды SGDT, SLDT и SIDT сохраняют значения базы и предела в памяти. Управление этими таблицами возлагается на операционную систему, так как команды загрузки таблицы дескриптора привилегированны.
Таблица глобальных дескрипторов содержит дескрипторы, доступные для всех задач системы. GDT может содержать любые дескрипторы сегментов, кроме дескрипторов, используемых для обслуживания прерываний. Обычно GDT содержит код и сегменты данных, используемые в операционных системах, сегменты состояния задачи, а также дескрипторы таблиц LDT. Первому элементу GDT соответствует несуществующий селектор, который обычно не используется (нулевой селектор определяет значение нулевого указателя).
Таблица локальных дескрипторов содержит дескрипторы, используемые в какой-то одной задаче. Обычно ОС создаются таким образом, чтобы каждая задача имела отдельную LDT. LDT может содержать только код, данные, стек, вентиль задачи и дескрипторы вентиля вызова. Таблицы LDT обеспечивают механизм для изоляции кода и сегмента данных отдельных задач от ОС, в то время как GDT содержит дескрипторы, общие для всех задач. Задача не может получить доступ к сегменту, если ее дескриптор сегмента отсутствует в одной из текущих LDT или GDT. Это обеспечивает защиту сегментов задач и в то же время совместное использование глобальных данных различными задачами. В отличие от шестибайтных GDTR и LDTR доступная программно часть LDTR хранит только дескриптор LDT в GDT.
Таблица дескрипторов прерываний содержит дескрипторы, указывающие на адреса 256 векторов прерываний. IDT может содержать только вентили задач, вентили прерываний и вентили ловушек. IDT должна быть не менее 256 байт, для того чтобы разместить дескрипторы 32 прерываний, зарезервированных фирмой Intel.
Каждое прерывание, используемое в системе, должно иметь дескриптор в IDT. IDT используется при выполнении команд INT, аппаратных прерываниях и при возникновении особых ситуаций.
Каждый селектор связан с соответствующим дескриптором. Дескрипторы имеют размер 8 байтов и содержат 32-битовую базу линейного адреса, 20-битовую длину и атрибуты связанных с ними сегментов. Эти атрибуты указывают, в каких единицах задан размер сегмента, а также определяют уровень защиты, уровни чтения, записи и выполнения, тип сегмента и длину операндов (16 или 32). Все атрибуты занимают 12 битов дескриптора.
В терминах языка ассемблера структура дескриптора может быть описана следующим образом:
STRUC desc_struc
limit dw 0 ; младшие 16 бит предела сегмента
base_lo dw 0 ; младшее слово 32-битового физического адреса сегмента
base_lhi db 0 ; младший байт старшего слова 32-битового физического адреса сегмента
access db 0 ; байт права доступа
attr&lim db 0 ; четыре бита атрибутов и старшие четыре бита предела сегмента
base_hhi db 0 ; старший байт старшего слова 32-битового физического адреса сегмента
ENDS desc_struc
Тогда таблицу GDT можно определить как набор дескрипторов со структурой desc_struc:
GDT_BEG = $ ; отметка начала GDT
LABEL gdtadr WORD
gdt_0 desc_struc <> ;первый элемент не используется
gdt_gdt desc_struc <GDT_SIZE -1,,,DATA_ACC,,>
gdt_ds desc_struc <DSEG_SIZE -1,,,DATA_ACC,,>
gdt_cs desc_struc <CSEG_SIZE -1,,,CODE_ACC,,>
gdt_ss desc_struc <STACK_SIZE-1,,,DATA_ACC,,>
GDT_SIZE = ($ - GDT_BEG) ; вычисление размера GDT
3. Оборудование
4. Задание на работу
Изменить программу, приведенную в приложении , в соответствии с заданием, выданным преподавателем.
5. Содержание отчета
6. Контрольные вопросы
Какие значения может принимать уровень привилегированности PL процессора Pentium?
Уровень привилегированности дескриптора это:
Какой формат имеет дескриптор сегмента данных?
Какое поле не содержит дескриптор шлюза?
Выберите правильную последовательность возврата в реальный режим?
Что произойдет, если программа загрузит в сегментный регистр значение, которое не являются правильным селектором, описанным в соответствующих дескрипторных таблицах?
Какая из приведенных ниже структур может быть пригодна для создания дескрипторов в программе:
Какое значение поля TYPE имеют дескрипторы LDT?
Какая команда загружает предел и базу таблицы глобальных дескрипторов в соответствующий ей регистр?
Сколько векторов прерываний зарезервировано фирмой Intel для обработки исключений в процессоре Pentium?
