OSDev Wiki
Регистрация
Advertisement

Одной из характерных черт архитектуры ПК является размещение в физическом адресном пространстве памяти не только собственно памяти компьютера (ОЗУ и ПЗУ), но и видеопамяти, а также регистров различных контроллеров. Ощутимым недостатком ПК, отчасти обусловленным историческими причинами, является фрагментация адресного пространства, когда ОЗУ, видеопамять, ПЗУ и регистры устройств расположены «лоскутами», довольно хаотично чередуясь друг с другом. Чтобы определить диапазоны физических адресов, в которых действительно находится оперативная память — а именно это обычно требуется знать операционной системе в первую очередь — в BIOS предусмотрено несколько функций, о практическом использовании которых можно прочитать в статье Определение объёма памяти. Здесь же мы рассмотрим общую картину распределения физического адресного пространства памяти между различными устройствами, как её видит процессор, а значит, и программист. Это описание основывается на документации фирмы Intel на чипсет G45, однако аналогичным образом адресное пространство памяти распределяется и для других чипсетов.

Заметим, что программист может поменять карту распределения памяти, перепрограммировав чипсет. Однако это, скорее всего, приведёт к потере компьютером работоспособности, поскольку код режима управления системой (SMM), находящийся в BIOS и отвечающий за такие вещи, как управление электропитанием, регулировка частоты вращения вентиляторов, эмуляция клавиатуры и мыши PS/2 и т.д., рассчитан на строго определённое распределение адресного пространства памяти, а именно на то, которое устанавливается BIOS.

Особенности чипсета G45[]

Чипсет G45, как и другие чипсеты Intel этой же серии (G43, P43 и P45), включает две микросхемы, однако за распределение физического адресного пространства памяти отвечает главным образом одна из них, обычно называемая «северным мостом» и обозначаемая GMCH (Graphic and Memory Controller Hub, концентратор контроллеров графики и памяти). GMCH является связующим звеном между:

  1. процессором, в документации именуемым «хостом» и подключаемым к GMCH с помощью шины FSB (Front Side Bus);
  2. модулями оперативной памяти стандарта DDR2 или DDR3, включёнными в одно- или двухканальном режиме и именуемыми системной памятью (System Memory);
  3. шиной PCI Express, обычно используемой для подключения дискретного графического контроллера, хотя годящейся и для любого другого подходящего устройства;
  4. второй микросхемой чипсета — концентратором контроллеров ввода-вывода ICH10/ICH10R, подключаемым к GMCH посредством специализированной шины DMI (Direct Media Interface, является разновидностью PCI Express).

Кроме того, в состав GMCH входит встроенный графический контроллер, обозначаемый в документации IGD (Internal Graphics Device). Обращения к памяти могут инициироваться хостом (процессором), встроенным графическим контрллером или устройствами, подключенными к шинам PCI Express и DMI. В зависимости от адреса и настроек GMCH эти запросы могут относиться к системной памяти, устройствам на шинах PCI Express и DMI либо иметь специальное назначение.

Шина FSB, соединяющая процессор с GMCH, поддерживает 36-разрядный физический адрес, что позволяет процессору адресовать до 64 Гбайт памяти. Объём системной памяти, поддерживаемый контроллером памяти, являющимся составной частью GMCH, может находиться в пределах от 256 Мбайт до 16 Гбайт (DDR2) или 8 Гбайт (DDR3). Шина PCI Express имеет один порт с 16 линиями, обозначаемый в документации PEG (PCI Express Graphics, поскольку он служит главным образом для установки графической платы; чипсет P45 отличается от G45 тем, что не имеет встроенного графического процессора, зато поддерживает либо один порт с 16 линиями, либо два с 8-ю, обозначаемых PEG и PEG2, что позволяет установить две видеоплаты). Если на PCI Express размещается какое-либо устройство, оно обычно занимает часть адресного пространства памяти (например, встроенному графическому процессору нужно выделить диапазон адресов, в котором будет находиться выделяемая ему видеопамять). Шине DMI также требуется выделить определённую часть адресного пространства, потому что именно через неё (и через ICH, подключенный к ней) процессор получает доступ к ПЗУ BIOS. Кроме того, контроллеры, входящие в состав ICH, а также подключаемые к нему извне, также могут требовать выделения им диапазона адресов памяти. Таким образом, физическое адресное пространство памяти разделяется между системной памятью, устройствами на шинах PCI Express и DMI. Примечательно, что реализация PCI Express в чипсете G45 полностью соответствует стандарту на эту шину, поэтому находящееся на ней устройство может адресовать свыше 64 Гбайт памяти, однако обращения по большим адресам могут быть переданы лишь другому устройству на PCI Express или же на шину DMI и через неё — на ICH.

Распределение памяти[]

G45-system-address-ranges

Типичная карта распределения физического адресного памяти для GMCH G45

Типичная карта распределения физического адресного пространства памяти для чипсета Intel G45 показана на рисунке. Она в целом применима и к любым другим чипсетам, в том числе иных производителей: все они схожи в главном, различаясь лишь деталями. В центральной части показано распределение физического адресного пространства памяти с точки зрения процессора, а значит, и программиста (Host/System View), справа — с точки зрения контроллера памяти (Physical Memory).

Заметим, что различные диапазоны адресов не должны перекрываться. За правильную настройку чипсета, обеспечивающую выполнение этого требования, отвечает BIOS. Если из-за каких-то манипуляций с регистрами чипсета произойдёт перекрытие диапазонов, обращение по адресу, относящемуся к перекрывающемуся диапазону, даст непредсказуемые результаты.

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

  • унаследованный диапазон адресов (Legacy Address Range);
  • нижний диапазон адресов главной памяти (Main Memory Address Range; на рисунке в него входит также область TSEG);
  • нижний диапазон адресов памяти PCI (PCI Memory Address Range);
  • верхний диапазон адресов главной памяти (Main Memory Address Range);
  • диапазон адресов перемещённой главной памяти (Main Memory Reclaim Address Range);
  • верхний диапазон адресов памяти PCI (PCI Memory Address Range).

Унаследованный диапазон адресов[]

G45-dos-legacy-address-range

Распределение памяти в унаследованном диапазоне адресов

Младший мегабайт адресного пространства (физические адреса от 0000_0000 до 000F_FFFF включительно) называется унаследованным диапазоном адресов (Legacy Address Range), поскольку его структура определяется требованиями совместимости с ранними моделями ПК. Он состоит из нескольких частей.

Нижние 640 Кбайтов (адреса 0000_0000 — 0009_FFFF) всегда отображаются на оперативную память: это так называемая стандартная память.

Далее следуют 128 Кбайтов (адреса 000A_0000 — 000B_FFFF), которые на ранних ПК использовались для доступа к видеопамяти. Конкретная их структура зависела от типа используемого видеоадаптера и его режима работы; например, цветные графические адаптеры в графических режимах использовали видеопамять, начинающуюся с адреса A0000, а информация в текстовых режимах размещалась с адреса B8000.

В современных компьютерах эта область выполняет две функции. Во-первых, она используется для совместимости со старым программным обеспечением и позволяет обращаться к видеопамяти. Применительно к чипсету G45 обычные доступы к этим адресам могут в зависимости от его настроек передаваться либо интегрированному графическому устройству (IGD, если используется встроенная графика), либо на шину PCI Express (если используется отдельный графический контроллер, установленный в гнездо этой шины), либо на шину DMI и далее через ICH на шину PCI (если используется графический контроллер, установленный в гнездо PCI).

Во-вторых, эта область может использоваться кодом режима управления системой (SMM). Когда процессор обращается к этим адресам в режиме SMM, GMCH передаёт его системной памяти, а не графическому контроллеру.

Следующие 128 Кбайтов (адреса 000C_0000 — 000D_FFFF) — это область расширения (Expansion Area). По этим адресам могут располагаться ПЗУ BIOS внешних устройств. GMCH делит эту область на 8 сегментов по 16 Кбайтов, каждый из которых может быть индивидуально настроен на доступ процессора к соответствующим адресам ОЗУ либо переадресован на DMI, причём чтение и запись настраиваются индивидуально (т. е., например, чтение может направляться на DMI, а запись — к ОЗУ). Любое обращение по этим адресам со стороны устройств, находящихся на PCI Express или DMI, всегда передаётся системной памяти. BIOS в процессе инициализации определяет наличие периферийных устройств с ПЗУ. По очереди отображая их на этот диапазон, она вызывает код из этих ПЗУ, который инициализирует соответствующие периферийные устройства. По окончании инициализации несколько первых сегментов отводятся под ОЗУ, где располагается копия ПЗУ видеоконтроллера, что сделано с целью совместимости.

Область расширенной системной BIOS (Extended System BIOS Area) занимает следующие 64 Кбайта (адреса 000E_0000 — 000E_FFFF). Она разделена на четыре сегмента по 16 Кбайтов; обращения процессора к каждому сегменту могут направляться либо в оперативную память, либо на шину DMI и далее через ICH к ПЗУ BIOS, причём доступы на чтение и запись настраиваются отдельно.

Область системной BIOS (System BIOS Area) занимает старшие 64 Кбайта унаследованного диапазона (адреса 000F_0000 — 000F_FFFF). Она не делится на сегменты; доступы к этой области направляются либо в оперативную память, либо на шину DMI и далее через ICH к ПЗУ BIOS, причём чтение и запись опять-таки настраиваются индивидуально.

Нижний диапазон адресов главной памяти[]

G45-main-memory-address-range

Карта нижнего диапазона адресов главной памяти

Нижняя часть диапазона адресов главной памяти (Main Memory Address Range) располагается от границы 1 Мбайта (начиная с адреса 0010_0000) до границы нижней доступной физической памяти (Top of Low Usable Physical Memory; эта величина находится в регистре GMCH TOLUD, её устанавливает BIOS). Весь этот диапазон может быть прямо отображён на физическую память, однако здесь возможны исключения, рассмотренные ниже.

Дыра ISA (ISA Hole) располагается между 15 и 16 Мбайтами адресного пространства памяти (00F0_0000 — 00FF_FFFF). Исторически её появление связано с микропроцессором 80286, способным в защищённом режиме адресовать до 16 Мбайт памяти, старший мегабайт которой был отведён под ПЗУ BIOS и некоторые другие нужды (в первую очередь под видеопамять). Современные компьютеры в ней не нуждаются, поэтому обычно эта дыра отключена, а её адреса отображаются на физическое ОЗУ. Однако теоретически некоторым устройствам может потребоваться память именно из этого диапазона, и тогда средствами настройки BIOS дыру надо включить. Когда она включена, все обращения к памяти в этом диапазоне передаются на шину DMI, а ОЗУ становится недоступным.

Необязательная область TSEG предназначена для использования кодом режима управления системой. Её размер может изменяться (для G45 он может составлять 1, 2 или 8 Мбайт), а располагается она в верхней части нижнего диапазона адресов главной памяти: её концом служит либо адрес, находящийся в TOLUD, либо адрес, с которого начинается память, отведённая для нужд встроенного графического контроллера (о ней — чуть ниже). Доступ к памяти в области TSEG возможен только со стороны процессора и только при нахождении его в режиме SMM.

Область памяти для нужд IGD выделяется только в том случае, если используется встроенный графический контроллер; на рисунке она не показана. В случае чипсета G45 эта область состоит из двух смежных участков. Первый участок находится в верхней части нижнего диапазона главной памяти, заканчиваясь адресом TOLUD. Он предназначен для хранения таблицы переадресации графического контроллера (Graphics Translation Table, GTT) и носит название «Pre-allocated Graphics GTT Stolen Memory», а его объём составляет 1 или 2 Мбайта. Второй участок, «Pre-allocated Graphics VGA Memory», имеет размер от 1 до 256 Мбайт, находится ниже первого участка и выше области TSEG и используется для хранения информации, необходимой для работы встроенного графического контроллера в режиме совместимости с VGA.

Нижний диапазон адресов памяти PCI[]

G45-pci-memory-address-range

Карта нижнего диапазона адресов памяти PCI

Нижний диапазон адресов памяти PCI (PCI Memory Address Range) находится между TOLUD и границей 4 Гбайт (заканчивается адресом FFFF_FFFF). Большая его часть отображается на шину DMI и служит для доступа к контроллерам, входящим в состав ICH или подключенным к шинам, обслуживаемым ICH, а также к ПЗУ BIOS. Однако ряд областей этого диапазона на DMI не отображается. Ниже различные участки адресов этого диапазона обсуждаются подробнее.

В самой верхней части этого диапазона, вплотную к границе 4 Гбайт, находится область верхней BIOS (High BIOS), под которую отведено 2 Мбайта (адреса FFE0_0000 — FFFF_FFFF). Эта область отображается на шину DMI и через ICH обеспечивает доступ к ПЗУ системной BIOS и BIOS контроллеров, если таковые имеются.

Один мегабайт в диапазоне адресов от FEE0_0000 до FEEF_FFFF отведён под пространство памяти прерываний FSB (FSB Interrupt Memory Space). Когда какое-либо устройство осуществляет запись по этим адресам, GMCH передаёт эту операцию на шину FSB как сообщение о прерывании.

Ещё один мегабайт (адреса FEC0_0000 — FECF_FFFF) зарезервирован для регистров конфигурационного пространства APIC (APIC Configuration Space). Это пространство разделено на две равные части. Нижняя половина (FEC0_0000 — FEC7_FFFF) служит для взаимодействия с IOAPIC, который физически обычно является частью ICH, хотя может быть выполнен и в виде отдельного контроллера. В любом случае обращения процессора к памяти по этим адресам передаются на шину DMI.

Верхняя половина этого мегабайта (FEC8_0000 — FECF_FFFF) может быть отображена GMCH на подключенный к нему «графический» порт PCI Express. Эта возможность используется, если там находится дополнительный IOAPIC. Однако на обычных ПК дополнительный IOAPIC не применяется, и запросы к этим адресам тоже передаются на шину DMI; впрочем, и на этой шине им обычно никакое устройство не соответствует. На практике можно считать, что эта область является зарезервированной.

Заметим, что на приведённом рисунке, взятом из документации на чипсет, для области FEC8_0000 — FECF_FFFF ошибочно указан локальный APIC процессора (LAPIC). На самом деле LAPIC занимает область адресов FEE00000 — FEE00FFF (всего 4 Кбайта), при этом у каждого логического процессора в системе имеется свой LAPIC в одних и тех же адресах: когда процессор производит обращение к этой области, запрос сразу поступает в LAPIC, не выходя за пределы кристалла процессора; следовательно, GMCH просто не узнает о самом факте такого обращения. Обращения устройств по этим адресам, как уже писалось выше, рассматриваются как запросы прерываний.

Необязательная область HSEG, назваемая иногда верхним пространством памяти SMM (High SMM Memory Space), может располагаться в диапазоне адресов FEDA_0000 — FEDB_FFFF. Если она имеется, то доступы к ней со стороны процессора, находящегося в режиме управления системой, отображаются на область ОЗУ с адресами 000A_0000 — 000B_FFFF (т.е. на нижнюю память режима управления системой, занимающую те же адреса, что унаследованная видеопамять, но доступные только в режиме SMM). Доступы к HSEG в других режимах являются недопустимыми. Если же область HSEG отсутствует, все обращения к этому диапазону адресов передаются, как и большинство других обращений в нижнем диапазоне адресов PCI, на шину DMI.

В оставшихся адресах может находиться конфигурационное пространство PCI Express (PCI Express Configuration Space). Его точный размер и местоположение зависят от настроек GMCH; на рисунке оно занимает адреса от E000_0000 до EFFF_FFFF. Подробнее о назначении и функциях этого конфигурационного пространства говорится в описании шины PCI Express.

Всё остальное пространство нижнего диапазона адресов памяти PCI отведено под память и регистры внешних устройств. Большинство из них либо являются частью ICH, либо находятся на шинах PCI и PCI Express, подключаемых к ICH, поэтому GMCH передаёт обращения по этим адресам на шину DMI. Однако часть устройств может находиться на шине PCI Express, подключенной к самому GMCH (обычно это дискретный видеоконтроллер). Устройством, использующим адресное пространство памяти из данного диапазона, является встроенный в GMCH графический контроллер (IGD). Наконец, в GMCH входит ряд других вспомогательных контроллеров, которые также нуждаются в некотором пространстве адресов памяти из этого диапазона. Таким образом, оставшиеся адреса распределяются между внутренними устройствами GMCH и шинами PCI Express и DMI. На рисунке все они обозначены как DMI Interface.

Верхний диапазон адресов главной памяти[]

Верхний диапазон адресов главной памяти (Main Memory Address Range) начинается с границы 4 Гбайт (адрес 1_0000_0000) и простирается вверх почти до конца физически установленной памяти (её адрес в процессе инициализации заносится BIOS в регистр TOM — Top Of Memory). До самого конца физической памяти этот диапазон не доходит по той причине, что какое-то количество самых верхних адресов используется для нужд одного из компонентов GMCH — так называемого Measurement Engine (ME, «измерительный движок»). Объём этого изымаемого участка может доходить до 64 Мбайт, однако верхняя граница диапазона адресов главной памяти всегда выравнивается на границу 64 Мбайта, поэтому, если объём изымаемого участка меньше этой величины, неиспользованная память просто пропадает.

Диапазон адресов перемещённой главной памяти[]

Нижний диапазон адресов памяти PCI «съедает» значительное количество адресного пространства памяти, лежащего ниже границы 4 Гбайт (на практике потеря может достигать 1,5 и даже 2 Гбайт в зависимости от типов и количества установленных контроллеров). Чтобы эта оперативная память не пропадала впустую, GMCH может обеспечить к ней доступ, используя адреса, лежащие сразу за верхним диапазоном адресов главной памяти: доступы к ним переотображаются на адреса физической памяти, лежащие ниже границы 4 Гбайта. Эта «спасённая» область ОЗУ называется диапазоном адресов перемещённой главной памяти (Main Memory Reclaim Address Range). С точки зрения операционной системы разницы между этой областью и верхним диапазоном адресов главной памяти нет, поэтому можно считать, что это единая область, начинающаяся с адреса 1_0000_0000 и заканчивающаяся адресом, находящимся в регистре TOLUD (Top of Upper Usable Physical Memory, вершина верхней пригодной для использования физической памяти).

Верхний диапазон адресов памяти PCI[]

Верхний диапазон адресов памяти PCI начинается сразу за концом доступной физической памяти (TOUUD) и продолжается до конца адресуемого пространства памяти, т.е. до границы 64 Гбайт (адрес F_FFFF_FFFF). Эти адреса могут отображаться на шины PCI Express и DMI и использоваться для доступа к регистрам и памяти различных контроллеров, поддерживающих адресацию свыше 4 Гбайт.

Advertisement