Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


УПРАВЛЕНИЕ И ДОСТУП К ОПЕРАТИВНОЙ ПАМЯТИ.



 

4.1. Распределение ОП на платформе IBM PC

 

Вся память на IBM PC характеризуется двумя параметрами: сегмент адреса и смещение адреса. В ОС MS DOS, а также внутри программы смещение адреса имеет длины 2 байта и сегмент адреса – 2 байта. Как правило, в Pascal смещение и сегмент образуют специальный тип, который носит атрибут – pointer. Сегмент и смещение разделяются двоеточием.

На платформе IBM PC ОП делится на страницы длиной 64 Кб. При этом нулевая страница всегда является страницей ПЗУ. В этой странице записывается информация о конфигурации компьютера, а также могут быть ссылки на ПЗУ видеопроцессора, ПЗУ других периферийных устройств с постоянной памятью. В первой странице, как правило, располагаются резидентные программы (программа, выполняющаяся в процессе функционирования компьютера в течение сеанса).

К наиболее важным программам относятся планировщик задач, служит для загрузки и выгрузки всех исполняемых модулей; супервизор ввода - вывода (для управления вводом-выводом периферийных устройств); драйверы ввода – вывода и управления процессами. В зависимости от ОС резидентные программы могут занимать 1, 2 страницы и более. В ОС MS DOS, начиная с третьей или четвертой страницы, находится память доступная для пользовательской программы. Эта память заканчивается адресом А000:0. На картинке: ВП – видеопамять; РП – расширенная память. В ОС Windows, как правило, основная память полностью используется под ОС, а все пользовательские программы выполняются в расширенной памяти.

 

 

4.2. Методы обращения к памяти

 

4.2.1.Определение адреса с помощью указателя.

 

 Определяем тип переменной, тип указателя.

var

p:pointer;

….

….

 begin

p:=addr(…); { То же самое можно сделать через коммерческое а - @.}

....

end.

Необходимо помнить, что с помощью такого метода мы можем получить не только адреса переменных, но и адрес процедуры и функции. Таким образом, транслятору Турбо Паскаля безразлично с чем вы работаете с сегментом кода или сегментом данных.

В процессе выполнения загрузочного модуля программный код делится на 4 группы:

1. Сегмент команд – это выполняемые команды в машинном коде, может занимать более 1 страницы.

2. Сегмент данных – может занимать больше 1 страницы, но одно данное не может превышать 62 Кбайт.

3. Программный стек – часть оперативной памяти, служащая для заполнения значения регистров центрального процесса после вызова подпрограммы, адресов возврата и промежуточного хранения данных.. Принцип работы стека – первый вошел, последний вышел. Как правило величина стека различна для различных типов языков, в функциональных языках стек больше, чем в процедурных, поэтому в функциях и логических языках часто используется метод рекурсия (т.е. вызов процедурой или функцией самой себя ).

1) Куча – специальная область памяти, предназначенная для определенных динамических действий. В Турбо Паскале куча строится по следующим параметрам:

1) Собираются все свободные места между концом сегмента данных или команд и концом страницы.

2) Выделяется одна специальная страница (или меньше) под кучу и стек. Величину кучи или стека можно изменить задав {$M n1, n2, n3} n1- задает количество байт в стеке; n2 - память, отведенная для подпрограммы; n3- длина кучи.

Необходимо помнить (особенно при проектировании программ оболочек с вызовом других выполняемых программ), что величина стека должна превышать 4 тысячи байт.

В зависимости от типа транслятора куча может быть автоматически очищена или нет. В языке Паскаль не происходит запоминание и восстановление текущего адреса кучи и ее размера, поэтому с одной стороны не возможно автоматическое освобождение кучи. С другой стороны пользователь может передавать любые данные из подпрограммы через кучу.

В языке СИ происходит автоматическое запоминание адреса и величины кучи, которая приводит к автоматическому очищению кучи после выхода из подпрограммы.

 

4.2.2. Использование атрибута absolute

 

Атрибут absolute употребляется для полного выделения типа переменной и накладывается на уже выделенную переменную или агрегат.

Var R: real;

i3:array [0..2] of word absolute R;

c6:array [1..6] of char absolute i3;

videoarray[1..max] of byte absolute $A000:0;

i3-накладывает массив из трех беззнаковых целых на переменную R;

с6- накладывает массив из шести символов на массив i3;

video-массив 1..max из байт по абсолютному шестнадцатеричному адресу А000:0;

Распределение абсолютное к ячейкам памяти, допуск в TURBO PASCAL и если программа не работает в защищенном режиме (без расширенной оперативной памяти).

Данная проблема решается с использованием специально определенных констант: например, $A000:0 рекомендуется записывать константой segA000:0. Кроме того, существуют еще несколько констант, определяющих сегменты адреса оперативной памяти.

 

4.2.3. Предопределенные массивы в TURBO PASCAL и DELPHI.

 

Существуют два предопределенных массива для обращения к конкретным адресам оперативной памяти (все эти массивы имеют строгие имена и в программе не должно быть объявлений с данными именами): Mem и MemW.

1) Mem [Seg:Ofs]-осуществляет обращение к ячейке памяти длиной 1 байт по адресу, сегмент адреса и смещение адреса. Seg и Ofs адреса обязательно должны быть по типу word. Не рекомендуется внутри сегмента или смещения адреса употреблять арифметические операции div и *. При использовании беззнаковых данных во избежание ошибок в процессе вычислений рекомендуется предварительно явно преобразовать результат операции к типу longint :

Var

a,b:word;

l:longint;

begin

...

l:=longint(a) div longint(b)

a:=l;{a:=word(l);}

l:=Mem[a:b];

b:=Mem[$A000:b];

При употреблении шестнадцатеричных констант в массиве Mem так же рекомендуется использовать предопределенные константы.

 

2) MemW[Seg:Ofs]-2 байта, обращается к целому беззнаковому.

 

Функции по работе с адресами: Seg(var p):word; Ofs(var p):word. Seg-возвращение сегмента адреса от указателя; Ofs- возвращает смещение адреса.

Не рекомендуется обращаться к первой и второй странице ОП.

 


Поделиться:



Последнее изменение этой страницы: 2019-04-19; Просмотров: 211; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.018 с.)
Главная | Случайная страница | Обратная связь