Видео: YouTube
Согласно определению, это совокупность допустимых адресов каких либо объектов вычислительной системы. Это могут быть ячейки памяти. Вот о них и поговорим. Насколько это важный вопрос? Да без него и не стоит затрагивать операционные системы вообще, это один из основных вопросов. В этом цикле статей мы не собираемся учиться по программе учебной дисциплины полгода, а то и больше. Рассмотрим наиболее важные вопросы, легко, приятно и на оптимальную глубину.
Простой пример адресного пространства
В одной из прошлых статей мы коснулись такого вопроса, как вывод информации. В том простом процессоре для индикации результата вычисления использовались светодиоды, подключенные к регистру вывода.
Каждый бит параллельного регистра подсоединен к светодиоду, поэтому они показывают двоичный вид числа. Пользователь уже сам переводит число в привычный ему вид. Процедура вывода информации представляет собой сохранение содержимого регистра аккумулятор в памяти по адресу 31. При этом на шине адреса выставляется двоичный код числа 31, это 11111. Дешифратор адреса, представленный многовходовым элементом конъюнкции выставляет на выход уровень логической единицы, позволяющий произвести запись результата с шины данных в регистр вывода. Это были низкоуровневые технические подробности. Программистам удобнее представлять адреса в виде такой таблицы.
Нижняя ячейка это слово в памяти данных по нулевому адресу. А по адресу 31 уже регистр вывода. Такая схема наглядно демонстрирует адресное пространство этой вычислительной системы.
Проекция оборудования на память
Логический и физический адрес
Теперь перейдем к недавно разработанной архитектуре учебного компьютера.
Адрес инструкции подается с регистра PC из регистрового файла в контроллер памяти. Адрес данных в памяти рассчитывается на этом арифметико-логическом устройстве из базы и смещения относительно базы. Как мы уже видели, это очень удобное решение для программистов. Сумма базы и смещения приводит к появлению так называемого логического адреса.
Это такой адрес, который представляет себе программист приложения и то, если программирует на таком низкоуровневом языке, как ассемблер. Пришло время заглянуть во внутренности контролера памяти. Некоторый список 16-разрядных адресов связан не с записью в оперативную память, а определенными регистрами.
В нашей архитектуре выделено 16 адресных регистров. На схеме адресного пространства они занимают самые верхние адреса 16-битного адресного пространства. Каждый регистр имеет разрядность 16 бит. Их имена это аббревиатуры PAR, что читается как Page Address Register или по-русски адресный регистр. Они имеют номера от 0 до 15. Эти регистры необходимы для вычисления реального физического адреса инструкций либо данных внутри памяти. Как же это происходит. На самом деле все довольно просто. В составе контроллера памяти имеется арифметико-логическое устройство разрядностью 24 бита.
Рассчитанный 16-битный логический адрес складывается с содержимым адресного регистра, смещенного на 8 бит. Все неиспользованные линии являются нулями. Результатом суммы является реальный физический адрес инструкции либо данных. Разрядность адреса 24 бита. Этой разрядностью можно охватить пространство в 16 мегабайт. Действительно, два в степени 24 это более 16 миллионов адресов. В данном примере логический адрес это 0. Содержимое адресного регистра это тоже 0. Как и следует ожидать, физически мы обращаемся к нулевой ячейке памяти.
Теперь что-то изменилось. В содержимом адресного регистра появилось число 2. Вычисление физического адреса дает результат 512. Таким образом, с точки зрения программиста он также обращается по нулевому адресу, но служебное аппаратное обеспечение компьютера перенаправляет запросы к памяти по совсем другим физическим адресам.
Страницы памяти
За выбор адресного регистра отвечают старшие 4 бита логического адреса.
Остальные же 12 бит являются смещением внутри так называемой страницы памяти. В нашем примере под страницу выделено 12 бит, поэтому размер страницы это 2 в двенадцатой степени, а это 4 килобайта. Начало страницы задается содержимым адресного регистра, смещенным влево на 8 бит. Еще для лучшего понимания можно рассмотреть такой рисунок.
Программист представляет себе смежные страницы памяти. Один адрес указывает на ячейку памяти в нулевой странице, второй адрес указывает на ячейку в следующей за нулевой странице. Благодаря адресным регистрам, происходит незаметная подмена адресов. Это не сказывается ни на правильности выполнения программы, ни на производительности архитектуры. Сейчас важно все это осознать, а зачем это, разберемся чуть позднее.
Атрибуты страниц
Каждому адресному регистру, описывающему где находится страница, соответствует регистр атрибутов страницы.
Итого, мы имеем еще 16 регистров, их адреса указаны на рисунке. Обращаясь по этим адресам, программа заносит данные не в оперативную память, а в эти служебные регистры. Зеленым цветом помечена область, отвечающая за размер страницы. При ограничениях доступных программе адресов схема контроля позволяет выявлять нарушения и сообщать об этом пользователю. Такой подход хорош тем, что защищает другие данные и не позволяет их случайно повредить. Все что произойдет, это вызовется другая программа, которая уберет из памяти программу нарушителя. При этом другие приложения спокойно продолжат свою работу. Иногда нужно чтобы данные никуда не перемещались с места на место. Красный бит позволяет защитить такие страницы от перемещения. Зачем такие опции также разберемся позже. Наконец, младшие три бита содержимого регистров атрибутов страниц отвечают за разрешение доступа к странице. Если из страницы можно считывать, то третий справа бит будет единицей. Если в страницу можно записывать, то второй бит справа будет единицей. И, наконец, страницы с машинными инструкциями помечаются единицей в самом правом бите. Цифровая схема внутри контроллера памяти позволяет выявлять все нарушения доступа и вызывать соответствующие программы, чтобы обработать ту или иную ситуацию.
Регистры присутствия страниц и регистр дескриптора процесса
Еще в контроллере памяти присутствуют 4 регистра.
Три из них показывают признак наличия страницы памяти в соответствующих местах. Страниц памяти у каждой программы может быть до шестнадцати, каждая страница, соответствует одному из битов. Единица — страница есть, ноль — страницы нет. Такие регистры со специальной схемой позволяют организовать перекачку страниц между быстрой кэш памятью и оперативной памятью, также, в случае нехватки оперативной памяти страницы могут быть откачены на диск. Регистр с именем PD это указатель на область памяти, где лежит структура, описывающая работающую программу. Подробности этой структуры сейчас тоже не будут рассмотрены. Красный бит отвечает за привилегии. Если бит нулевой, то программе можно обращаться по любым адресам. Если бит единица, то для этой программы будет работать схема контроля адресов. Такой порядок в той или иной разновидности принят в более-менее сложных процессорах с давних пор и традиции продолжаются по сей день. Операционная система, драйвера устройств это программный код с высокой степенью привилегий. Им можно работать со всем доступным адресным пространством. Прикладным программам запрещено обращаться за пределы допустимых адресов. Любое нарушение карается аварийным завершением программы, сообщением пользователю об ошибке.
Проекция контроллера шины на память
Еще одной выделенной областью в адресном пространстве являются адреса для работы с регистрами контроллера шины.
Весь ввод и вывод информации происходит через периферийные устройства, которые подключены к специальной шине. Такое построение компьютеров началось в давние времена и продолжается по сей день.
Конечно же разработчикам прикладных программ не нужно знать никаких подробностей порядка обмена данными с устройствами и контроллерами. Все эти особенности скрыты в глубоких слоях программного кода драйверов устройств. Об этом подробнее в будущих статьях. Негативные явления такого построения существуют и оказывают заметное действие на скорость работы программ. В той или иной степени хороший программист должен быть предупрежден и вооружен.
Архитектура х86
Насколько рассмотренная архитектура близка к реальной жизни? Для этого рассмотрим одну из самых популярных архитектур компьютеров. Она носит название x86. В начале восьмидесятых годов прошлого века компания Intel и IBM начали подминать под себя весь рынок настольных компьютеров. Первоначально в процессоре был вот такой список 16-битных регистров.
Адресное пространство составляло 1 мегабайт, схема представлена на рисунке. Под вывод текста на экран выделялась область памяти, помеченная зеленым цветом.
Для операционной системы и прикладных программ было доступно около 640 килобайт свободной памяти.
Как же 16-битные регистры могли организовать доступ за пределы 64 килобайт? Да так же просто.
Физический адрес вычисляется путем сложения содержимого регистров. Один из регистров, называемый сегментным перед сложением сдвигается влево на 4 бита. Разрядность физического адреса составляет 20 бит, что позволяет адресовать до мегабайта информации, куда входят программный код, данные и регистры всевозможного оборудования.
Эта архитектура впоследствии увеличила разрядность с 16 бит до 32, а потом и до 64 бит. Необходимость в обратной совместимости программ принуждало разработчиков аппаратуры совершать очередные подвиги. Старые программы все еще было необходимо запускать на новых компьютерах. Цена таких подвигов это крайне запутанная система команд, дескрипторов и вообще сейчас новичкам уже почти нет шансов в этом разобраться. Это тяжелое наследие десятилетий.