Поиск по сайту:


«Assembler IBM PC 4. Сегментированная организация памяти в реальном режиме. Виды памяти в среде MS-DOS»

Файл: 4 КБ
Поделиться:

В компьютерах IBM PC используются процессоры фирмы Intel серии i80x86 (i8086 в компьютерах PC/XT и Pentium 4 – условно i80886 – в последних моделях компьютеров). При этом каждый из процессоров, начиная с i80286, имеет специальный режим эмуляции (программной совместимости) базового процессора i8086 с добавлением возможности использования 32-разрядных регистров, начиная сi80386. Обычно этот режим называется режимом реального адреса (Real Address Mode) или R-режим. На какие же параметры процессора i8086 была сориентирована разработка операционной системы MS-DOS, работающая в данном режиме? Данный процессор имеет 16-разрядную внутреннюю архитектуру и такой же разрядности шину данных. Таким образом, диапазон представления целых чисел (данные или адрес) не превышает 216 – 1 = 65535 (или 64 К – 1). Однако адресная шина включает 20-линий, что соответствует объёму адресуемой памяти 220 = 1 Мбайт (память в компьютере состоит из однобайтовых ячеек, а порядковый номер ячейки образует её физический адрес).

Для того, чтобы с помощью 16-разрядных адресов можно было обращаться в любую точку 20-разрядного адресного пространства, введён двухкомпонентный логический адрес из 16-разрядных компонент:

"Segment (сегмент) : Offset (смещение)".

Здесь Segment – адрес сегмента, а Offset – смещение в этом сегменте. По умолчанию, в реальном режиме используется сегментная модель памяти с объёмом сегмента в 64 Кбайта, расположение объекта в котором, относительно его базового адреса, определяется смещением Offset. Расположение сегмента в адресном пространстве, а также механизм перехода от логического адреса к физическому показан на рис. 2.

 
 
 

 

 

 

 

 

 

 

 

Рис. 2. Сегментированная модель памяти реального режима

 

Рассмотрим пример с использованием 16-теричной системы счисления. Пусть логический адрес равен 0040h : 0220h. Тогда соответствующий ему физический адрес равен 0040h*10h + 0220h = 00620h. Надо отметить, однако, что обратный переход – от физического адреса к логическому – неоднозначен. В общем случае, сегментация – механизм адресации, обеспечивающий несколько независимых адресных пространств как в пределах одной задачи, так и в системе в целом для защиты задач от взаимодействия друг на друга. Назначением базовых адресов сегментов занимается операционная система, а внутри каждого сегмента адреса формируются программой. Это эффективный адрес или смещение OffsetВажные замечания:

¨  DОS в зависимости от объёма кода и данных программы может так назначить базовые адреса, что они будут перекрываться;

¨  физический адрес базы сегмента кратен числу 16, поэтому сегменты начинаются на границах блоков с разницей в 16 байт (параграф);

¨  сегментная организация обеспечивает создание позиционно – независимых или динамически перемещаемых программ. Каждое исполнение программы может происходить с различными значениями базовых адресов сегментов, которые выбираются DОS, исходя из особенностей загрузки памяти.

Основной недостаток реального режима заключается в малом объеме 
адресного пространства (всего 1Мбайт) в сочетании с малыми значениями 
сегментов (всего 64 Кбайт). Однако, в то время – 1981 г. – думалось иначе. 
Этот недостаток был устранён в старших моделях процессоров i80x86 с 
32-разрядной архитектурой, использующих защищённый режим виртуального адреса Protected Virtual Address Mode (или просто защищённый режим – P-ре-жим) равный в пределе 4 Гбайтам (64 Гбайта для 36-разрядной адресной шины).

Рассмотрим распределение первого мегабайта памяти компьютера. В зависимости от модификации компьютера, настройки драйверов, управляющих памятью (а также типа версии используемой Windows), структура памяти несколько меняется. Однако размещение основных компонентов памяти (табл. 1) строго унифицировано.

Таблица 1

Распределение первого мегабайта памяти компьютера

Номер

сегмента

Сегментный адрес

Описание

Вид

памяти

 

220-1

 

 

Расширенная память 
(спецификация eXtended Memory Specification – XMS)

XMS

 

 

 

11

110000h

 

 

10

100000h

Высокая память (High Memory Area – HMA)

 

F

F000h

ПЗУ  BIOS

Upper

Memory

Area

(UMA)

384 Кбайт

 

E

 

Свободные адреса

 

D

 

Свободные адреса

 

C

C000h

ПЗУ  расширений  BIOS

 

В

B800h

Текстовая видеопамять

 

B000h

Графический видеобуфер

 

А

A000h

 

9

9000h

 

 

Свободная память для загружаемых прикладных

и системных (резидентных) программ

(~570 Кбайт)

Conventional Memory

Area

(CMA)

640 Кбайт

 

8

 

 

1

0070h

 

Резидентная часть COMMAND.COM

 

0

Загружаемые драйверы DOS

 

Ядро операционной системы DOS –

файлы IO.SYS и MSDOS.SYS

 

0050h

Область данных DOS (512 байт)

 

0040h

Область данных BIOS (256 байт)

 

0000h

Таблица векторов прерываний (1 Кбайт)

 

 

 

Первые 640 Кбайт адресного пространства называются основной или стандартной CMA-памятью и по принципу работы являются памятью с произвольным доступом, допускающей как считывание, так и запись данных (ОЗУ или в англоязычной транскрипции RAM – Random Access Memory). Это та область, которую могли адресовать первые версии DOS. Оставшаяся часть памяти объёмом 384 Кбайт (область верхней памяти – UMA) использовалась видеоадаптером и ПЗУ BIOS. Начальный килобайт памяти занят векторами прерываний (256 векторов по 4 байта). Далее, над таблицей векторов, располагается область данных BIOS, которая занимает объём в 256 байт. В этой области хранятся разнообразные данные, используемые BIOS в процессе управления периферийным оборудованием. Этими данными могут пользоваться и разработчики прикладных программ на ассемблере (см. табл. 2). Начиная с сегментного адреса 0050h, располагается область данных DOS. К некоторым данным этой области (данные не являются документированными) можно обращаться только через посредство программных прерываний. Выше резидентной части командного процессора обычно загружаются необходимые резидентные программы (русификаторы, антивирусные программы). Оставшаяся часть CMA-памяти для загрузки прикладных DOS-программ, как правило, не превышает ~ 500 Кбайт.

Таблица 2

Содержание некоторых полей области данных BIOS

Адрес
(
offset)

Размер,
байт

Типичное
значение

Описание

00h, 02h

2+2

03F8h, 02F8

Базовые порты COM1 и COM2

08h

2

03BCh

Базовый порт LPT1

10h

2

C463h

Состав установленного оборудования

13h

2

0280h=640Кбайт

Основная память

17h, 18h

1+1

Первый и второй байты флагов клавиатуры

1Ah

2

001Eh – 003Ah

Головной указатель клавиатурного буфера

1Ch

2

001Eh – 003Eh

Хвостовой указатель клавиатурного буфера

49h

1

03h

Текущий видеорежим

4Ah

2

50h=80

Ширина экрана

4Ch

2

1000h=4байта

Размер видеостраницы

4Eh

2

 

Смещение в видеобуфере текущей видеостраницы

50h

16

Позиции курсора на каждой видеостранице

60h

2

0607h

Форма курсора

6Ch

4

Счётчик прерываний системного таймера, 18,2 Гц

72h

2

0000h

Режим начальной загрузки: 0000h – полный циклPOST, 1234h – укороченный цикл после нажатия Ctrl-Alt-Del

80h

2

001Eh

Адрес начала буфера клавиатуры

F0h -FFh

16

Нули

Область межзадачных связей

 

 

Блоки верхней памяти UMA различаются как по принципу работы – ОЗУ или ПЗУ, так и по месту расположения в компьютере. Видеопамять (тип OЗУ) – обычно находится в составе видеоадаптера, программы BIOS (тип ПЗУ) – на материнской плате компьютера.

Всё, что выше первого мегабайта, получило название расширенной или XMS-памяти (см. табл. 1). Как уже отмечалось выше, доступ к расширенной памяти осуществляется в защищённом режиме и она не доступна для DOS.

Однако в составе DOS имеются два драйвера, которые позволяют пользоваться XMS-памятью в ограниченном объёме. Первый драйвер Himem.sys разрешает DOS загрузить себя в первый сегмент расширенный памяти, получившей название высокой памяти – High Memory (HMA). Второй – Emm386.exe- может выполнять две альтернативные функции:

–     отображение расширенной памяти на свободные адреса верхней UMA-памяти (Expanded memory – EMS),

–     загрузку драйверов и резидентных программ DOS (системных и прикладных) из CMA-памяти на свободные адреса верхней памяти UMA.

Указанные функции реализуются посредством модификации конфигурационных файлов Config.sys и Autoexec.bat. В начале файла Config.sys помещаются две строки, осуществляющие загрузку данных файлов (в начале Himem.sys, затем Emm386.exe), затем, в третьей строке, – директиву DOS с параметрами: High и UMB. Параметр High пролонгирует назначение драйвера Himem.sys, UMB – разрешает DOS управлять блоками верхней памяти через посредство драйвера Emm386.exe. Вот, к примеру, как это выглядит для Windows 9x:

              ........

Device=C:\Windows\Himem.sys

Device=C:\Windows\Emm386.exe Noems

Dos=High,Umb

В конце второй строки добавляется ключевое слово Ram, если требуется реализация от драйвера функции отображения расширенной памяти в UMB, или Noems – для указанной выше альтернативной функции. В дальнейшем записываются строки, загружающие драйвера (при наличии Noems) в верхнюю память с помощью команды Devicehigh. Например:

Devicehigh=C:\Windows\Command\Ansi.sys

При этом загрузка резидентов выполняется в Autoexec.bat командой Loadhigh(Lh). Выполнение подобной работы позволяет освободить CMA-память для загружаемых команд до уровня ~ 600 Кбайт.

Для просмотра памяти можно воспользоваться следующими командами:

Mem/d/p – постраничный просмотр модулей и драйверов всей памяти;

Mem/m:<filename> – вывод подробных сведений об использовании памяти заданным модулем.

При установке на компьютер системы Windows 2000 функция загрузки подсистемы DOS в память HMA, через посредство драйвера Himem.sys, выполняется по умолчанию. Кроме того, драйвер Emm386.exeв этой системе уже не используется, а его функции в файле Config.nt частично выполняет команда Emm. Описание данной команды приведено в виде комментариев в файле Config.nt для Windows 2000.

Рассмотренные выше строчки в Config.nt можно представить в виде:

              ........

device=%SystemRoot%\system32\himem.sys

Emm=Ram

Dos=High,Umb

Devicehigh=C:\Windows\Command\Ansi.sys

Вообще система Windows 2000 автоматически оптимизирует использование памяти для подсистемы MS-DOS и её программ. Для резервирования за программой DOS определённых объёмов памяти различных типов щёлкните правой кнопкой на значке исполняемого файла программы и выберите из контекстного меню команду Свойства. В окне свойств откройте вкладку Память (рис. 3).

 

Рис. 3. Окно свойств с открытой вкладкой Память

·     В рамке Обычная память задаётся необходимый для работы программы объём памяти в Кбайтах (от 0 до 640 Кб.). В раскрывающемся списке Переменные среды задаётся объём памяти (в байтах) для интерпретатора команд Command.com (проявляет себя только при запуске Windows 9x). Установка флажка Защищённый режим препятствует изменению программой установленной структуры и объёма обычной памяти, что защищает систему от зависания в случае ошибок в программе.

·     В рамке Отображаемая (EMS) память указывается максимальный объём физической памяти, отображаемой в диапазоне свободных адресов верхней памяти, который может быть выделен программе.

·     В рамке Дополнительная (XMS)-память можно установить флажок Использовать HMA для загрузки программы в высокую память, однако если в HMA-память загружена DOS (что более необходимо), положение флажка не играет роли.

·     В рамке Память DPMI для защищённого режима MS-DOS задаётся предельный объём памяти DPMI для защищённого режима DOS, который может быть выделен программе (проявляет себя только при запуске Windows 9x).

Для просмотра памяти можно воспользоваться следующими командами:

mem/d – выводит сведения о загруженных программах и внутренних драйверах, а также вывод других сведений о программах (при необходимости используйте постраничный вывод с помощью команды more, например, mem/d|more);

mem/c – выводит сведения о программах, загруженных в обычную память и в верхнюю область памяти, а также итоговые сведения об использовании памяти.

 

 

[1] Ram указывает, что система должна распределить только 64 Кбайт из области UMB для буфера страниц EMS -памяти и оставить остальное место (если таковое имеется) для использования DOS, чтобы обеспечить поддержку команд LOADHIGH и DEVICEHIGH. По умолчанию система использует всю доступную память из области UMB для буфера страниц EMS-памяти. Размер Emm указывается в PIF-файле для данного приложения, либо в файле _default.pif. Если в PIF-файле в качестве размера EMS задан нуль, то строка Emm в файле настройки DOS игнорируется.