Если процессор находится в режиме реального времени, как он может получить доступ к памяти> 1 МБ (0xFFFFFFF0H)
Практически ничто внутри ЦП не заботится о "режиме ЦП". При выполнении обычных инструкций; на самом деле важны такие вещи, как размер кода по умолчанию, база сегмента, предел сегмента, тип сегмента и т. д., а режим ЦП не имеет значения. Это только такие вещи, как загрузка регистров сегмента и обработчики прерываний, где важен режим ЦП (фактически, кроме подкачки страниц, я не удивлюсь, если единственные вещи, которые заботятся о режиме ЦП, это вещи, реализованные в микрокоде).
Поскольку режим ЦП в основном не имеет значения для обычных инструкций (и потому, что такие вещи, как размер кода по умолчанию, база сегмента, предел сегмента, тип сегмента и т. Д., Являются единственными вещами, которые действительно имеют значение); при включении или перезагрузке ЦПУ может устанавливать «ненормальные» значения (значения, которые обычно невозможны для режима ЦП) в регистры сегментов, а остальной ЦП это не заботит. В частности, он может делать «CS.base_address = 0xFFFF0000
» (что невозможно в реальном режиме, когда загрузка регистра сегмента CS будет «CS.base_address = 16_bit_CS.value << 4
»).
Конечным результатом является то, что все обращения к памяти, которые включают в себя CS (и проходят проверку ограничения сегмента), заканчиваются переходом на (линейный) адрес «0xFFFF0000 + offset
», даже если ЦП находится в «реальном режиме» и даже если это не Обычно это невозможно для реального режима.
Обратите внимание, что в реальном режиме адреса не ограничены 1 МБ. Например, если вы загрузите 0xFFFF в регистр сегмента, то CPU установит скрытую информацию этого сегмента в регистр «gment.base = 0x000FFFF0 », а адреса, использующие этот сегмент, получат (линейные) адреса от 0x000FFFF0 до 0x0010FFEF. Вот почему (когда был выпущен 80286) нам потребовался «вентиль A20» для совместимости с древним программным обеспечением (чтобы заставить 20-й адресный бит быть нулевым без знания ЦП).
Также обратите внимание, что хотя "CS.base_address = 0xFFFF0000
" не является нормальным для реального режима; программное обеспечение может переключиться в защищенный режим и загрузить «размер кода = 16-битный, предел сегмента»
64 КиБ, дескриптор сегмента base = 0xFFFF000 "в CS; затем переключиться обратно в реальный режим без перезагрузки CS. Конечным результатом будет та же" ненормальная база CS ", которую ЦП устанавливает при включении или сбросе.
Конечно (независимо от того, как ненормальное значение попало в CS.base) любая нормальная загрузка регистра сегмента CS, которая выполняется в реальном режиме, приведет к тому, что для CS.base будет установлено нормальное значение; поэтому микропрограммное обеспечение должно гарантировать, что не будет загружаться регистр сегмента CS, пока он выполняется в «реальном режиме» по ненормальному адресу.
Как это происходит или что происходит, когда объем оперативной памяти <4 ГБ (скажем, 2 ГБ) </p>
Физическое адресное пространство используется для ОЗУ, ПЗУ и устройств отображения памяти. ПЗУ (а не ОЗУ) будет чуть ниже адреса «4 ГиБ». Например, если ПЗУ имеет размер 2 МБ, он будет находиться в диапазоне физических адресов от 0xFFE00000 до 0xFFFFFFFF. Обратите внимание, что при включении питания встроенное ПО не может использовать ОЗУ (необходимо выяснить, какие типы и размеры модулей памяти установлены, и настроить контроллер памяти в соответствии с требованиями, прежде чем он сможет ожидать, что ОЗУ заработает).
Если BIOS отображается в 0x000FFFFFH, почему процессор начинает работать в 0xFFFFFFF0H
Первоначально (80286 и более старые процессоры) BIOS фактически отображался в 0x000FFFFF. Для (некоторых) 80386 и более поздних процессоров это эмулируется только из соображений совместимости. Вместо; микропрограмма копирует небольшой фрагмент из ПЗУ (в области, заканчивающейся на физический адрес 0xFFFFFFFF) в ОЗУ (в области, заканчивающейся на физический адрес 0x000FFFFF); и затем настраивает контроллер памяти таким образом, чтобы записи, сделанные в эту область ОЗУ, игнорировались (чтобы контроллер памяти не пересылал эти записи в микросхемы ОЗУ).
Обратите внимание, что для систем с «чистым UEFI» (не включая системы «гибридный BIOS + UEFI») у микропрограмм нет причин устанавливать «устаревшую область BIOS», заканчивающуюся физическим адресом 0x000FFFFF;и RAM в этой области может быть используемой RAM (настроенной как «разрешить запись» в контроллере памяти и т. д.).Точно так же другие унаследованные области (для VGA и ПЗУ устройства) также не нужны для «чистого UEFI»;и теоретически (для компьютера с 2 ГБ ОЗУ или меньше) нет никаких причин (за исключением небольшого количества кражи SMM), вы не можете просто иметь единую непрерывную область нормальной оперативной памяти от 0x00000000 до 0x7FFFFFFF.