В какой области адресного пространства расположен bios
ЦП x86 начинает выполнение с физического адреса 0xFFFFFFF0. Там в конце адресного пространства находится ПЗУ BIOS. Первая инструкция, которую ЦП выполняет из ПЗУ, - это дальний переход, который вызывает перезагрузку сегмента CS, поэтому следующая инструкция выполняется из физической области 0x000F0000 - 0x000FFFFF.
Что заставляет ROM реагировать на оба региона? Есть ли на ПК особая логика декодирования адресов? Я нашел комментарий в исходном коде Bochs, в котором говорится, что последние 128 КБ ПЗУ BIOS сопоставлены с 0xE0000 - 0xFFFFF. Однако я не могу найти больше информации об этом. Ясно, что это что-то специфическое для ПК, так как у меня встроенная плата x86, и такого зеркалирования там не происходит. Я могу использовать только ближний прыжок.
На ПК всегда задействована некоторая логика декодирования адресов, потому что в физическом адресном пространстве есть несколько «дыр / окон», через которые доступны ПЗУ BIOS и устройства ввода-вывода (например, видеокарта) вместо ОЗУ. Это сделано специально из соображений совместимости, поэтому старые программы могут работать на новых компьютерах.
Что касается начального адреса, по которому ЦП начинает выполнение после сброса, если вы посмотрите документацию, вы увидите, что ЦП класса Pentium начинаются с этого:
EIP = 0xFFF0
CS.Selector = 0xF000
CS.Base = 0xFFFF0000
Если вы следуете обычной схеме адресации в реальном режиме, физический адрес должен быть CS.Selector * 16 + IP или, с замененными значениями, 0xFFFF0. Однако ЦП фактически вычисляет адрес с использованием CS.Base + (E) IP (в реальном и 16/32-битном защищенном режиме, но не в виртуальном 8086 или 64-битном защищенном режиме), следовательно, это первый адрес, который запрашивает ЦП. из памяти будет 0xFFFFFFF0. Ваша неспособность использовать дальние переходы для кодирования в ПЗУ по этому старшему адресу может быть из-за того, что загрузка в CS сбрасывает CS.Base на 16 * новое значение CS.Selector. Таким образом, переход, скажем, к 0xF000: 0xFFF0 передаст управление 0xFFFF0 вместо 0xFFFFFFF0, и если ПЗУ также не отображается в этом нижнем месте в памяти и код в нем не подходит для работы с CS (.Selector) = 0xF000, это не будет работать.
Кроме того, ни ЦП, ни схемы вокруг него не должны поддерживать все 32 (или более) адресных строки, если ПК ограничен размером не более 16 МБ (как было на i80286 и i80386SX) или 4 ГБ (как было на i80386DX / оригинал). i80386 и i80486) или 2 40-52 байта (на 64-разрядных процессорах класса Pentium), и в этом случае, если количество старших битов в физическом адресном пространстве игнорируется, можно сказать, что выполнение эффективно начинается с адрес ниже теоретического максимума - 16, например 0x00FFFFF0 (i80286 / i80386SX).
Если вам нужно решить проблемы с вашей платой, посмотрите ее документацию и схемы, чтобы узнать, как ПЗУ отображается в физическое адресное пространство на нем.
Спасибо. Меня особенно интересует утверждение «если только ПЗУ не отображается в этом нижнем месте». Так всегда ли верно для PC / AT-совместимой архитектуры, что ПЗУ отображается в обоих местах?
@manison: ЦП требует, чтобы первые инструкции были максимум -16, в то время как совместимость требует, чтобы остальная часть кода BIOS ПЗУ была доступна ниже точки 1 МБ (по крайней мере, некоторые его части). Итак, если эти первые инструкции хранятся в одном и том же ПЗУ, они должны отображаться в 2 разных местах. Но если первая инструкция конкретной марки ПК представляет собой дальний прыжок куда-то в ПЗУ (скажем, 0xF000: 0xFFF0), аппаратная реализация может вместо предоставления второго сопоставления просто ответить байтовой последовательностью этой команды дальнего перехода, когда читается память с максимум -16.
Кажется, Z80 имеет лучшую конструкцию, процессор запускается с адреса 0 при запуске, векторы прерываний размещаются после адреса запуска.
For legacy option ROMs and BIOS memory ranges, Intel chipsets usually come with memory aliasing capabilities that allow access to memory below 1 MB to be routed to or from DRAM or nonvolatile storage located just under 4 GB. The registers that control this aliasing are typically referred to as Programmable Attribute Maps (PAMs). Manipulation of these registers may be required before, during, and after firmware shadowing. The control over the redirection of memory access varies from chipset to chipset For example, some chipsets allow control over reads and writes, while others allow control over reads only.
Прочтите статью, чтобы получить более подробную информацию о отображении памяти устройства и инициализации, настройке и тестировании памяти.
Не следует думать, что термины "адресное пространство" и "оперативная память" эквивалентны. Адресное пространство - это просто набор адресов, которые умеет формировать процессор; совсем не обязательно все эти адреса отвечают реально существующим ячейкам памяти. В зависимости от модификации персонального компьютера и состава его периферийного оборудования, распределение адресного пространства может несколько различаться. Тем не менее, размещение основных компонентов системы довольно строго унифицировано. Типичная схема использования адресного пространства компьютера приведена на рис. 1.5. Значения адресов на этом рисунке, как и повсюду дальше в книге, даны в шестнадцатеричной системе счисления.
Рис. 1.5. Типичное распределение адресного пространства.
Первые 640 Кб адресного пространства с адресами от 00000h до 9FFFFh (и, соответственно, с сегментными адресами от 0000h до 9FFFh) отводятся под основную оперативную память, которую еще называют стандартной (conventional). Начальный килобайт оперативной памяти занят векторами прерываний, которые обеспечивают работу системы прерываний компьютера, и включает 256 векторов по 4 байта каждый. Вслед за векторами прерываний располагается так называемая область данных BIOS, которая занимает всего 256 байт, начиная с сегментного адреса 40h. Сама BIOS (от Basic In-Out System, базовая система ввода-вывода) является частью операционной системы, хранящейся в постоянном запоминающем устройстве. Это запоминающее устройство (ПЗУ BIOS) располагается на системной плате компьютера и является, таким образом, примером встроенного, или "зашитого" программного обеспечения. В функции BIOS входит тестирование компьютера при его включении, загрузка в оперативную память собственно операционной системы MS-DOS, хранящейся на магнитных дисках, а также управление штатной аппаратурой компьютера - клавиатурой, экраном, дисками и прочим. В области данных BIOS хранятся разнообразные данные, используемые программами BIOS в своей работе. Так, здесь размещаются:
- входной буфер клавиатуры, куда поступают коды нажимаемых пользователем клавиш;
- адреса видеоадаптера, а также последовательных и параллельных портов;
- данные, характеризующие текущее состояние видеосистемы (форма курсора и его текущее положение на экране, видеорежим, используемая видеостраница и проч.);
- ячейки для отсчета текущего времени и т.д.
Область данных BIOS заполняется информацией в процессе начальной загрузки компьютера, а затем динамически модифицируется системой по мере необходимости. Многие прикладные программы, особенно, написанные на языке ассемблера, обращаются к этой области с целью чтения или модификации содержащихся в них данных. С некоторыми ячейками области данных BIOS мы столкнемся при рассмотрении примеров конкретных программ.
В области памяти, начиная с адреса 500h, располагается собственно операционная система MS-DOS, которая обычно занимает несколько десятков Кбайт. Программы MS-DOS, как и другие системные составляющие (векторы прерываний, область данных BIOS) записываются в память автоматически в процессе начальной загрузки компьютера.
Вся оставшаяся память до границы 640 Кб свободна для загрузки любых системных или прикладных программ. Как правило, в начале сеанса в память загружают резидентные программы (русификатор, антивирусные программы). При наличии резидентных программ объем свободной памяти уменьшается.
Оставшиеся 384 Кб адресного пространства между границами 640 Кб и 1 Мб, называемые старшей, или верхней (upper) памятью, первоначально были предназначены для размещения постоянных запоминающих устройств (ПЗУ). Практически под ПЗУ занята только небольшая часть адресов, а остальные используются в других целях.
Часть адресного пространства старшей памяти отводится для адресации к графическому и текстовому видеобуферам графического адаптера. Графический адаптер представляет собой отдельную микросхему или даже отдельную плату, в состав которой входит собственное запоминающее устройство (видеопамять). Это запоминающее устройство не имеет никакого отношения к оперативной памяти компьютера, однако, его схемы управления настроены на диапазоны адресов A0000h. AFFFFh и B8000h. BFFFFh, входящих в общее с памятью адресное пространство процессора. Поэтому любая программа может обратиться по этим адресам и, например, записать данные в видеобуфер, что приведет к появлению на экране некоторого изображения. Если видеосистема находится в текстовом режиме, а запись осуществляется по адресам текстового видеобуфера, на экране появятся изображения тех или иных символов (букв, цифр, различных знаков). Если же перевести видеосистему в графический режим, и записывать данные в графический видеобуфер, то на экране появятся отдельные точки или линии. Можно также прочитать текущее содержимое ячеек видеобуфера.
В самом конце адресного пространства, в области адресов F0000h. FFFFFh, располагается ПЗУ BIOS - постоянное запоминающее устройство, о котором уже говорилось выше.
Часть адресного пространства, начиная с адреса C0000h, отводится еще под одно ПЗУ - так называемое ПЗУ расширений BIOS для обслуживания графических адаптеров и дисков.
В состав компьютера, наряду со стандартной памятью (640 Кб), входит еще расширенная (extended) память, максимальный объем которой может доходить до 4 Гбайт. Эта память располагается за пределами первого мегабайта адресного пространства и начинается с адреса 100000h. Реально на машине может быть установлен не полный объем расширенной памяти, а лишь несколько десятков Мбайт или даже меньше.
Поскольку функционирование расширенной памяти подчиняется "спецификации расширенной памяти" (Extended Memory Specification, сокращенно XMS), то и саму память часто называют XMS-памятью. Как уже отмечалось выше, доступ к расширенной памяти осуществляется в защищенном режиме, поэтому для MS-DOS, работающей только в реальном режиме, расширенная память недоступна. Однако в современные версии MS-DOS включается драйвер HIMEM.SYS, поддерживающий расширенную память, т.е. позволяющий ее использовать, хотя и ограниченным образом. Конкретно в расширенной памяти можно разместить электронные диски (с помощью драйвера RAMDRIVE.SYS) или дисковые кэш-буферы (с помощью драйвера SMARTDRV.SYS).
Первые 64 Кб расширенной памяти, точнее, 64 Кб - 16 с адресами от 100000h до 10FFEFh, носят специальное название область старшей памяти (High Memory Area, HMA). Эта область замечательна тем, что хотя она находится за пределами первого мегабайта, к ней можно обратиться в реальном режиме работы микропроцессора, если определить сегмент, начинающийся в самом конце мегабайтного адресного пространства, с сегментного адреса FFFFh, и разрешить использование адресной линии А20. Первые 16 байт этого сегмента заняты ПЗУ, область же со смещениями 0010h. FFFFh можно, в принципе, использовать под программы и данные. MS-DOS позволяет загружать в HMA (директивой файла CONFIG.SYS DOS=HIGH) значительную часть самой себя, в результате чего занятая системой область стандартной памяти существенно уменьшается. Старшую память обслуживает тот же драйвер HIMEM.SYS, поэтому загрузка DOS в HMA возможна, только если установлен драйвер HIMEM.SYS.
Как видно из приведенного выше рисунка, часть адресного пространства верхней памяти, не занятая расширениями BIOS и видеобуферами, оказывается свободной. Эти свободные участки можно использовать для адресации к расширенной памяти (конечно, не ко всей, а лишь к той ее части, объем которой совпадает с общим объемом свободных адресов старшей памяти). Отображение расширенной памяти на свободные адреса старшей памяти выполняет драйвер EMM386.EXE, а сами участки старшей памяти, "заполненные" расширенной, называются блоками верхней памяти (Upper Memory Blocks, UMB). MS-DOS позволяет загружать в UMB устанавливаемые драйверы устройств, а также резидентные программы. Загрузка системных программ в UMB освобождает от них стандартную память, увеличивая ее транзитную область. Загрузка в UMB драйверов осуществляется директивой файла CONFIG.SYS DEVICEHIGH (вместо директивы DEVICE), а загрузка резидентных программ - командой DOS LOADHIGH. На оптимально сконфигурированном компьютере системными компонентами заняты лишь около 20. 25 Кб основной памяти, а вся остальная память в объеме около 620 Кб может использоваться для загрузки прикладных программ.
Функции ОС по управлению памятью в мультипрограммной системе:
- отслеживание свободной и занятой памяти;
- выделение памяти процессам и освобождение памяти по завершении процессов;
- вытеснение кодов и данных процессов из оперативной памяти на диск (полное или частичное), когда размеры основной памяти не достаточны для размещения в ней всех процессов, и возвращение их в оперативную память, когда в ней освобождается место;
- настройка адресов программы па конкретную область физической памяти.
- защита памяти - важная задача операционной системы, которая состоит в том, чтобы не позволить выполняемому процессу записывать или читать данные из памяти, назначенной другому процессу. Эта функция реализуется программными модулями ОС и аппаратными средствами.
Для идентификации переменных и команд используются символьные имена (метки), виртуальные адреса и физические адреса (рисунок 6.1).
- Символьные имена присваивает пользователь при написании программы на алгоритмическом языке или ассемблере.
- Виртуальные адреса, называемые иногда математическими, или логическими адресами, вырабатывает транслятор, переводящий программу на машинный язык. Поскольку во время трансляции в общем случае не известно, в какое место оперативной памяти будет загружена программа, то транслятор присваивает переменным и командам виртуальные (условные) адреса, обычно считая, что начальным адресом программы будет нулевой адрес.
- Физические адреса соответствуют номерам ячеек оперативной памяти, где в действительности расположены переменные и команды.
Совокупность виртуальных адресов процесса называется виртуальным адресным пространством.
Рисунок 6.1 – Типы адресов
Задача операционной системы - отображение индивидуальных виртуальных адресных пространств всех одновременно выполняющихся процессов на общую физическую память. При этом ОС отображает либо все виртуальное адресное пространство, либо только определенную его часть.
Существуют два отличающихся подхода к преобразованию виртуальных адресов в физические.
В первом случае замена виртуальных адресов на физические выполняется один раз для каждого процесса во время начальной загрузки программы в память. Специальная системная программа - перемещающий загрузчик - на основании имеющихся у нее исходных данных о начальном адресе физической памяти, в которую предстоит загружать программу, а также информации, предоставленной транслятором об адресно-зависимых элементах программы, выполняет загрузку программы, совмещая ее с заменой виртуальных адресов физическими.
Второй способ заключается в том, что программа загружается в память в неизмененном виде в виртуальных адресах, при этом операционная система фиксирует смещение действительного расположения программного кода относительно виртуального адресного пространства. Во время выполнения программы при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический.
Второй способ является более гибким, он допускает перемещение программы во время ее выполнения, в то время как перемещающий загрузчик жестко привязывает программу к первоначально выделенному ей участку памяти. Вместе с тем использование перемещающего загрузчика уменьшает накладные расходы, так как преобразование каждого виртуального адреса происходит только один раз во время загрузки, а во втором случае - каждый раз при обращении по данному адресу.
В некоторых случаях (обычно в специализированных системах), когда заранее точно известно, в какой области оперативной памяти будет выполняться программа, транслятор выдает исполняемый код сразу в физических адресах.
Обычно виртуальное адресное пространство процесса делится на две непрерывные части: системную и пользовательскую. В некоторых ОС (например, MS Windows NT) эти части имеют одинаковый размер - по 2 Гбайт, хотя деление может быть и другим, например 1 Гбайт - для ОС, и 3 Гбайт - для прикладных программ.
Часть виртуального адресного пространства каждого процесса, отводимая под сегменты ОС, является идентичной для всех процессов. Поэтому при смене активного процесса заменяется только вторая часть виртуального адресного пространства, содержащая его индивидуальные сегменты, как правило, — коды и данные прикладной программы (рисунок 6.2). Архитектура современных процессоров отражает эту особенность структуры виртуального адресного пространства, например, в процессорах Intel Pentium существует два типа системных таблиц: одна — для описания сегментов, общих для всех процессов, а другая - для описания индивидуальных сегментов данного процесса. При смене процесса первая таблица остается неизменной, а вторая заменяется новой.
Рисунок 6.2 - Общая и индивидуальные части виртуальных адресных пространств
Процессор x86 начинает выполнение по физическому адресу 0xFFFFFFF0. Там, в конце адресного пространства, находится BIOS ROM. Первая инструкция, которую CPU выполняет из ПЗУ, - это большой скачок, который вызывает перезагрузку сегмента CS, поэтому следующая инструкция выполняется из физической области 0x000F0000 - 0x000FFFFF.
Что заставляет ПЗУ реагировать на оба региона? Есть ли какая-то специальная логика декодирования адресов на ПК? Я нашел комментарий в исходном коде Bochs, в котором говорится, что последний 128K BIOS ROM сопоставляется с 0xE0000 - 0xFFFFF. Однако я не могу найти больше информации об этом. Очевидно, что это то, что характерно для ПК, поскольку у меня встроенная плата x86, и такого зеркалирования там не происходит. Я могу использовать только прыжок.
На ПК всегда присутствует какая-то логика декодирования адреса, потому что в физическом адресном пространстве есть несколько "отверстий/окон", через которые доступ к BIOS ROM и устройствам ввода/вывода (например, видеокарта) доступны вместо ОЗУ. Что по дизайну, по соображениям совместимости, старые программы все еще могут работать на более новых компьютерах.
Что касается начального адреса, по которому ЦП начинает выполнение после reset, если вы посмотрите на документацию, вы увидите, что процессоры класса Pentium начнут с этого:
Если вы следуете обычной схеме адресации в реальном режиме, физический адрес должен быть CS.Selector * 16 + IP или, при замене значений, 0xFFFF0. Однако ЦП фактически вычисляет адрес с использованием CS.Base + (E) IP (в реальном и 16/32-битном защищенном режиме, но не в виртуальном 8086 или 64-битном защищенном режиме), следовательно, первый адрес, который запрашивает процессор из памяти будет 0xFFFFFFF0. Ваша невозможность использовать большие переходы для кода внутри ПЗУ на этом высоком адресе может быть связана с тем, что при загрузке в CS будет reset CS.Base до 16 * новое значение CS.Selector. Итак, перепрыгивая, скажем, 0xF000: 0xFFF0 передаст управление в 0xFFFF0 вместо 0xFFFFFFF0, и если ПЗУ также не будет отображено на этом низком месте в памяти, а код в нем подходит для работы с CS (.Selector) = 0xF000, он не будет работать.
Кроме того, ни ЦП, ни схема вокруг него не должны поддерживать все 32 (или более) адресные строки, если на ПК ограничено максимум 16 МБ (как и на i80286 и i80386SX) или 4 ГБ (как это было на i80386DX/original i80386 и i80486) или 2 40-52 (на 64-разрядных процессорах класса Pentium), и если это так, если количество больших бит в физическом адресном пространстве игнорируется, выполнение можно сказать эффективно начать с адреса ниже теоретического максимума - 16, например 0x00FFFFF0 (i80286/i80386SX).
Если вам нужно решить проблемы с вашей доской, см. его документацию и схемы, чтобы узнать, как ПЗУ отображается в физическое адресное пространство на нем.
Для идентификации переменных и команд на разных этапах жизненного цикла программы используются символьные имена (метки), виртуальные адреса и физические адреса (рис. 5.1).
- Символьные имена присваивает пользователь при написании программы на алгоритмическом языке или ассемблере.
- Виртуальные адреса, называемые иногда математическими, или логическими адресами, вырабатывает транслятор, переводящий программу на машинный язык. Поскольку во время трансляции в общем случае не известно, в какое место оперативной памяти будет загружена программа, то транслятор присваивает переменным и командам виртуальные (условные) адреса, обычно считая по умолчанию, что начальным адресом программы будет нулевой адрес.
- Физические адреса соответствуют номерам ячеек оперативной памяти, где в действительности расположены' или будут расположены переменные и команды.
Совокупность виртуальных адресов процесса называется виртуальным адресным пространством. Диапазон возможных адресов виртуального пространства у всех процессов является одним и тем же. Например, при использовании 32-разрядных виртуальных адресов этот диапазон задается границами 0000000016и FFFFFFFF16. Тем не менее каждый процесс имеет собственное виртуальное адресное пространство — транслятор присваивает виртуальные адреса переменным и кодам каждой программе независимо (рис. 5.2).
Рис. 5.1. Типы адресов
Рис. 5.2. Виртуальные адресные пространства нескольких программ
Совпадение виртуальных адресов переменных и команд различных процессов не приводит к конфликтам, так как в том случае, когда эти переменные одновремеино присутствуют в памяти, операционная система отображает их на разные физические адреса 1 .
1 В том случае, когда необходимо, чтобы несколько процессов разделяли общие данные или коды, операционная система отображает соответствующие участки виртуального адресного пространства этих Процессов на один и тот же участок физической памяти. См. раздел «Разделяемые сегменты памяти»
В разных операционных системах используются разные способы структуризации виртуального адресного пространства. В одних ОС виртуальное адресное пространство процесса подобно физической памяти представлено в виде непрерывной линейной последовательности виртуальных адресов. Такую структуру адресного пространства называют также плоской (flat). При этом виртуальным адресом является единственное число, представляющее собой смещение относительно начала (обычно это значение 000. 000) виртуального адресного пространства (рис. 5.3, а). Адрес такого типа называют линейным виртуальным адресом.
В других ОС виртуальное адресное пространство делится на части, называемые сегментами (или секциями, или областями, или другими терминами). В этом случае помимо линейного адреса может быть использован виртуальный адрес, представляющий собой пору чисел (и, т), где n определяет сегмент, а т — смещение внутри сегмента (рис. 5.3, б).
Существуют и более сложные способы структуризации виртуального адресного пространства, когда виртуальный адрес образуется тремя или даже более числами.
Рис. 5.3. Типы виртуальных адресных пространств: плоское (а), сегментированное (б)
Задачей операционной системы является отображение индивидуальных виртуальных адресных пространств всех одновременно выполняющихся процессов на общую физическую память. При этом ОС отображает либо все виртуальное адресное пространство, либо только определенную его часть. Процедура преобразования виртуальных адресов в физические должна быть максимально прозрачна для пользователя и программиста.
Существуют два принципиально отличающихся подхода к преобразованию виртуальных адресов в физические.
В первом случае замена виртуальных адресов на физические выполняется один раз для каждого процесса во время начальной загрузки программы в память. Специальная системная программа — перемещающий загрузчик — на основании имеющихся у нее исходных данных о начальном адресе физической памяти, в которую предстоит загружать программу, а также информации, предоставленной транслятором об адресно-зависимых элементах программы, выполняет загрузку программы, совмещая ее с заменой виртуальных адресов физическими.
Второй способ заключается в том, что программа загружается в память в неизмененном виде в виртуальных адресах, то есть операнды инструкций и адреса переходов имеют те значения, которые выработал транслятор. В наиболее простом случае, когда виртуальная и физическая память процесса представляют собой единые непрерывные области адресов, операционная система выполняет преобразование виртуальных адресов в физические по следующей схеме. При загрузке операционная система фиксирует смещение действительного расположения программного кода относительно виртуального адресного пространства. Во время выполнения программы при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический. Схема такого преобразования показана на рис. 5.4. Пусть, например, операционная система использует линейно-структурированное виртуальное адресное пространство и пусть некоторая программа, работающая под управлением этой ОС, загружена в физическую память начиная с физического адреса S. ОС запоминает значение начального смещения S и во время выполнения программы помещает его в специальный регистр процессора. При обращении к памяти виртуальные адреса данной программы преобразуются в физические путем прибавления к ним смещения S. Например, при выполнении инструкции MOV пересылки данных, находящихся по адресу VA, виртуальный адрес VA заменяется физическим адресом VA+S.
Рис. 5.4.Схема динамического преобразования адресов
Последний способ является более гибким: в то время как перемещающий загрузчик жестко привязывает программу к первоначально выделенному ей участку памяти, динамическое преобразование виртуальных адресов позволяет перемещать программный код процесса в течение всего периода его выполнения. Но использование перемещающего загрузчика более экономично, так как в этом случае преобразование каждого виртуального адреса происходит только один раз во время загрузки, а при динамическом преобразовании — при каждом обращении по данному адресу.
В некоторых случаях (обычно в специализированных системах), когда заранее точно известно, в какой области оперативной памяти будет выполняться программа, транслятор выдает исполняемый код сразу в физических адресах.
Необходимо различать максимально возможное виртуальное адресное пространство процесса и назначенное (выделенное) процессу виртуальное адресное пространство. В первом случае речь идет о максимальном размере виртуального адресного пространства, определяемом архитектурой компьютера, на котором работает ОС, и, в частности, разрядностью его схем адресации (32-битная, 64-битная и т. п.). Например, при работе на компьютерах с 32-разрядными процессорами Intel Pentium операционная система может предоставить каждому процессу виртуальное адресное пространство до 4 Гбайт (2 32 ). Однако это значение представляет собой только потенциально возможный размер виртуального адресного пространства, который редко на практике бывает необходим процессу. Процесс использует только часть доступного ему виртуального адресного пространства.
Назначенное виртуальное адресное пространство представляет собой набор виртуальных адресов, действительно нужных процессу для работы. Эти адреса первоначально назначает программе транслятор на основании текста программы, когда создает кодовый (текстовый) сегмент, а также сегмент или сегменты данных, с которыми программа работает. Затем при создании процесса ОС фиксирует назначенное виртуальное адресное пространство в своих системных таблицах. В ходе своего выполнения процесс может увеличить размер первоначального назначенного ему виртуального адресного пространства, запросив у ОС создания дополнительных сегментов или увеличения размера существующих. В любом случае операционная система обычно следит за корректностью использования процессом виртуальных адресов — процессу не разрешается оперировать с виртуальным адресом, выходящим за пределы назначенных ему сегментов.
Максимальный размер виртуального адресного пространства ограничивается только разрядностью адреса, присущей данной архитектуре компьютера, и, как правило, не совпадает с объемом физической памяти, имеющимся в компьютере.
Сегодня для машин универсального назначения типична ситуация, когда объем виртуального адресного пространства превышает доступный объем оперативной памяти. В таком случае операционная система для хранения данных виртуального адресного пространства процесса, не помещающихся в оперативную память, использует внешнюю память, которая в современных компьютерах представлена жесткими дисками (рис. 5,5, а). Именно на этом принципе основана виртуальная память — наиболее совершенный механизм, используемый в операционных системах для управления памятью.
Рис. 5.5. Соотношение объемов виртуального адресного пространства и физической памяти: виртуальное адресное пространство превосходит объем физической памяти (а), виртуальное адресное пространство меньше объема физической памяти (б)
Однако соотношение объемов виртуальной и физической памяти может быть и обратным. Так, в мини-компьютерах 80-х годов разрядности поля адреса нередко не хватало для того, чтобы охватить всю имеющуюся оперативную память. Несколько процессов могло быть загружено в память одновременно и целиком (рис. 5.5, б).
Необходимо подчеркнуть, что виртуальное адресное пространство и виртуальная память — это различные механизмы и они не обязательно реализуются в операционной системе одновременно. Можно представить себе ОС, в которой поддерживаются виртуальные адресные пространства для процессов, но отсутствует механизм виртуальной памяти. Это возможно только в том случае, если размер виртуального адресного пространства каждого процесса меньше объема физической памяти.
Содержимое назначенного процессу виртуального адресного пространства, то есть коды команд, исходные и промежуточные данные, а также результаты вычислений, представляет собой образ процесса.
Во время работы процесса постоянно выполняются переходы от прикладных кодов к кодам ОС, которые либо явно вызываются из прикладных процессов как системные функции, либо вызываются как реакция на внешние события или на исключительные ситуации, возникающие при некорректном поведении прикладных кодов. Для того чтобы упростить передачу управления от прикладного кода к коду ОС, а также для легкого доступа модулей ОС к прикладным данным (например, для вывода их на внешнее устройство), в большинстве ОС ее сегменты разделяют виртуальное адресное пространство с прикладными сегментами активного процесса. То есть сегменты ОС и сегменты активного процесса образуют единое виртуальное адресное пространство.
Обычно виртуальное адресное пространство процесса делится на две непрерывные части: системную и пользовательскую. В некоторых ОС (например, Windows NT, OS/2) эти части имеют одинаковый размер — по 2 Гбайт, хотя в принципе деление может быть и другим, например 1 Гбайт — для ОС, и 2 Гбайт — для прикладных программ 1 . Часть виртуального адресного пространства каждого процесса, отводимая под сегменты ОС, является идентичной для всех процессов. Поэтому при смене активного процесса заменяется только вторая часть виртуального адресного пространства, содержащая его индивидуальные сегменты, как правило, — коды и данные прикладной программы (рис. 5.6). Архитектура современных процессоров отражает эту особенность структуры виртуального адресного пространства, например, в процессорах Intel Pentium существует два типа системных таблиц: одна — для описания сегментов, общих для всех процессов, а другая — для описания индивидуальных сегментов данного процесса.
1 Деление виртуального адресного пространства на две непрерывные области не является обязательным — можно представить себе ОС, которая обходится без него и чередует свои сегменты и сегменты прикладных программ, размещая их в виртуальном адресном пространстве в произвольном порядке.
При смене процесса первая таблица остается неизменной, а вторая заменяется новой.
Рис. 5.6. Общая и индивидуальные части виртуальных адресных пространств
Описанное выше назначение двух частей виртуального адресного пространства — для сегментов ОС и для сегментов прикладной программы — является типичным, но не абсолютным. Имеются и исключения из общего правила. В некоторых ОС существуют системные процессы, порожденные для решения внутренних задач ОС. В этих процессах Отсутствуют сегменты прикладной программы, по они могут расположить некоторые свои сегменты (сегменты ОС) в общей части виртуального адресного пространства, а некоторые — в индивидуальной части, обычно предназначенной для прикладных сегментов. И наоборот, в общей, системной части виртуального адресного пространства размещаются сегменты прикладного кода, предназначенные для совместного использования несколькими прикладными процессами.
Механизм страничной памяти в большинстве универсальных операционных систем применяется ко всем сегментам пользовательской части виртуального адресного пространства процесса. Исключения могут составлять специализированные ОС, например ОС реального времени, в которых некоторые сегменты жестко фиксируются в оперативной памяти и соответственно никогда не выгружаются на диск — это обеспечивает быструю реакцию определенных приложений на внешние события.
Системная часть виртуальной памяти в ОС любого типа включает область, подвергаемую страничному вытеснению (paged), и область, на которую страничное вытеснение не распространяется (non-paged). В не вытесняемой области размещаются модули ОС, требующие быстрой реакции и/или постоянного присутствия в памяти, например диспетчер потоков или код, который управляет заменой страниц памяти. Остальные модули ОС подвергаются страничному вытеснению, как и пользовательские сегменты.
Обычно аппаратура накладывает свои ограничения на порядок использования виртуального адресного пространства. Некоторые процессоры (например, MIPS) предусматривают для определенной области системной части адресного пространства особые правила отображения на физическую память. При этом виртуальный адрес прямо отображается на физический адрес (последний либо полностью соответствует виртуальному адресу, либо равен его части). Такая особая область памяти не подвергается страничному вытеснению, и поскольку достаточно трудоемкая процедура преобразования адресов исключается, то доступ к располагаемым здесь кодам и данным осуществляется очень быстро.
Читайте также: