В прошлых выпусках мы познакомились с дисковой памятью. Теперь мы начнём знакомство с оперативной памятью. Её нет так много, но она намного быстрее дисковой. Сегодняшний выпуск чисто теоретический, объяснит кое что об устройстве этой самой памяти. Точное положение человека определяет его почтовый адрес. Точное положение нашей программы также определяется адресами. Например для переменных, которые мы используем, отводится место в памяти и при работе программы используются не имена, а адреса переменных (т.е. точные указание их местаперебывания в памяти). Пока наши программы являются программами реального режима работы процессора (он называется Real Mode). Этот режим использовался на первых процессорах семейства 8086/88 (ну и на некоторых моделях далее, сейчас он оставлен для совместимости). Те Pentium'ы и Celeron'ы, которые стоят у вас являются дальними родственниками 8086. На этих процессорах использовалась сегментная модель памяти. Что это значит? Это значит, что вся память разбивается на куски (сегменты), например вот так:
| ПАМЯТЬ | |||
| сегмент 0 | сегмент 1 | сегмент 2 | и т.д. |
| сегмент 1 | |||
| смещение 0 | смещение 1 | смещение 2 | и т.д. |
10FA:01C2Замечу, что цифры, используемые в этой записи - шеснадцатеричные, если вы чувствуете себя не очень среди них, то вернитесь к выпуску #2 (http://web-pascal.narod.ru/ras/stunde/s2.htm), где объяснено о том, что это такое. Таким образом формально мы можем иметь доступ к адресам с 00000 - FFFFFh ( буква h в конце числа означает, что это число шеснадцатерично).. Замечу, что при Segment = FFFFh и Offset = FFFFh мы получим Address = 10FFEFh. Однако ввиду ограничения на шину адреса в 20 бит (т.е. размер Address в 20 бит, 20 двоичных цифр) эта комбиинация физически указывает на 0FFEFh - т.е. получается как бы кольцо с небольшим нахлёстом. Кстати наши программы тоже разбиты на сегменты. Различают сегмент кода, сегмент данных и сегмент стека. В сегменте данных хранятся все наши глобальные переменные. В сегменте кода находится код, который исполняет процессор (т.е. все наши процедуры, функции и главная часть программы от begin до end.). И в сегменте стека хранятся локальные переменные и кое-какая служебная информация. Со стеком мы уже сталкивались в предыдущих выпусках. Естесственно, что сегменты кода, данных и стека имеют размер в 64 Kb (сегмент стека может быть и меньше, его размер задаётся опцией Stack size, о которой говорилось в предыдущих выпусках). Например напишем такую программу:
10F0:0262
10E0:0362
program test;
var
a : array [0 .. 65535] of byte;
begin
end.
вроде бы ничего особенного. Просто большой массив. Однако попробуем запустить .... бац Error 22: Structure too large.(размер структуры слишком большой). Нетрудно понять, что наш массив не влезает в 1 сегмент, который отведён для данных. Точно так же обстоят дела и с кодом и со стеком. Ошибку переполнения стека мы уже разбирали. Получается, что в сумме память, которую использует наша программа равна 64 + 64 + 64 = 192 Кб. ??? Зачем же тогда на компьютеры ставят так много памяти? Так как наши программы работают в Real Mode, нам доступен только 1 Мбайт памяти (на самом деле ещё меньше) - максимальное число из 20 двоичных цифр. Остальные доступны в только защищённом режиме работы процессора. Те 192 Кб, которые мы насчитали называют статическими (т.к. они неизменны). Переменные, созданные в разделе переменных называются статическими переменными. В противоположность им есть динамические переменные - те память под которые выделяется и освобождается программистом. Ниже приведено распределение памяти:
- 00000h - 9FFFFh - Base Memory, 640 Кбайт - стандартная память, доступная программам реального режима. Распределена следующим образом:
- 00000h - 003FFh - Interupt Vectors - векторы прерываний, что это такое я раскажу позже.
- 00400h - 004FFh - BIOS Data Area - область переменных Bios.
- 00500h - 00xxxxh - DOS Area - область DOS
- 00xxxxh - 9FFFFh - User RAM - память, доступная для использования.
- A0000h - FFFFFh - Upper Memory Area (UMA), 384 Кбайта - верхняя память, зарезервированая для системных нужд. Например, в ней размещается память адаптеров.
- 10000h и выше - Extended Memory - дополнительная память, непосредственно доступная только в защищенном режиме процесора.
добавление
Хочу кое что добавить к предыдущим выпускам. Каждый раз создавая новый тип, мы сначала описывали его в разделе type, а потом создавали переменную этого типа в разделе var. Однако, если вам нужно только несколько глобальных (или локальных) переменных этого типа, то можно сделать так:
var
c : file of integer;
т.е. указать тип сразу после имени переменной, не описывая его предварительно. Вот это я и хотел добавить. 
