Код инициализации программного обеспечения в 0xFFFFFFF0H - PullRequest
5 голосов
/ 09 февраля 2012

Intel сообщает, что после сброса процессор переводится в реальный режим, а код инициализации программного обеспечения начинается с 0xFFFFFFF0H. Мои вопросы:

  • Если процессор находится в режиме реального времени, как он может получить доступ к памяти> 1 МБ (0xFFFFFFF0H)

  • Как это происходит или что происходит, когда объем оперативной памяти <4 ГБ (скажем, 2 ГБ) </p>

  • Если BIOS отображается в 0x000FFFFFH, почему процессор начинает работать в 0xFFFFFFF0H

Пожалуйста, помогите мне с этими вопросами. Спасибо.

Ответы [ 3 ]

6 голосов
/ 09 февраля 2012

Я наконец нашел ответ в документации Coreboot :

Всякий раз, когда процессор x86 просыпается после сброса, он делает это в реальном режиме. Этот режим ограничен адресным пространством 1 МБ и смещением 64 КБ, а вектор сброса исходного 8086/88 был расположен в 0xFFFF0.

Поскольку никаких изменений не было, даже если мы запустили текущие процессоры, такие как P3, эти новые процессоры также чувствуют, что они начинаются с 0xF000: 0xFFF0 после сброса. Но они этого не делают. Основание регистра сегмента кода после сброса составляет 0xFFFF0000, поэтому ЦП генерирует физический адрес 0xFFFFFFF0 для набора микросхем. И чипсет отвечает за пересылку этой области в загрузочное ПЗУ. Это сбивает с толку: процессор "думает", что он выполняет код в 0xF000: 0xFFF0, но вместо этого он использует код в 0xFFFFFFF0. Разработчики, должно быть, были ошарашены, когда реализовали эту конструкцию в кремний.

Так что, похоже, в документации Intel говорится о физическом адресе, который используется «по проводам», т. Е. При доступе к реальной шине. И это не зависит от режима ЦП (шина не знает или не заботится о режиме ЦП, это обязанность ЦП переводить эти вещи).

3 голосов
/ 05 февраля 2013

Чтобы увидеть ваш вопрос в действии, вам понадобится аппаратный отладчик.И надлежащая документация от Intel, чтобы процитировать: http://download.intel.com/design/processor/manuals/253668.pdf, раздел 9.1.4:

Первая инструкция, которая выбирается и выполняется после аппаратного сброса, находится по физическому адресу FFFFFFF0H.Этот адрес на 16 байт ниже самого верхнего физического адреса процессора.EPROM, содержащий код инициализации программного обеспечения, должен находиться по этому адресу.

Это означает, что ПЗУ BIOS, FYI, а не обычное ОЗУ, т. Е. Содержимое имеет аппаратную проводкуИ помните, что на этом этапе память ОЗУ даже не настроена, а память VGA (которая отличается от ОЗУ) даже не доступна и не инициализирована.

Адрес FFFFFFF0H находится за пределами адресации в 1 МБ.Диапазон процессора в режиме реального адреса.Процессор инициализируется по этому начальному адресу следующим образом.Регистр CS состоит из двух частей: видимой части селектора сегмента и скрытой части базового адреса.В режиме реального адреса базовый адрес обычно формируется путем сдвига 16-битного значения селектора сегмента на 4 бита влево, чтобы получить 20-битный базовый адрес.Однако во время аппаратного сброса селектор сегмента в регистре CS загружается с F000H, а базовый адрес загружается с FFFF0000H.Таким образом, начальный адрес формируется путем добавления базового адреса к значению в регистре EIP (то есть FFFF0000 + FFF0H = FFFFFFF0H).При первой загрузке регистра CS с новым значением после аппаратного сброса процессор будет следовать обычному правилу преобразования адресов в режиме реального адреса (то есть [базовый адрес CS = селектор сегмента CS * 16]).Чтобы гарантировать, что базовый адрес в регистре CS остается неизменным до тех пор, пока не будет завершен код инициализации программного обеспечения на основе EPROM, код не должен содержать дальний переход или дальний вызов или позволять происходить прерыванию (что может привести к изменению значения селектора CS)

В течение этого времени BIOS, по сути, инициализирует аппаратное обеспечение и саму память, все еще работая в реальном режиме.Затем, наконец, выполняется VGA BIOS (который существует в вашей VGA-карте, адресуемый по адресу 0xc700) и т. Д. И т. Д. Но это выходит за рамки текущего вопроса.Но приведенные выше замечания по существу ответили на ваш вопрос.

2 голосов
/ 08 марта 2019

Если процессор находится в режиме реального времени, как он может получить доступ к памяти> 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.

...