2012-02-09 1 views
3

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

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

  • Как это происходит и что происходит, когда оперативная память в < 4GB (скажем, 2 Гб)

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

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

+0

У вас есть документ для ссылки или цитаты? Это похоже на недоразумение. – DarkDust

+0

Руководство разработчика программного обеспечения Intel, руководство по системному программированию 3A, часть 1, стр. 9-20 (253668.pdf) – Albert

+0

Вам необходимо прочитать, как сегментные регистры работают в реальном режиме. Эффективный адрес = CS << 4 + IP. –

ответ

5

я, наконец, нашел ответ в Coreboot documentation:

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

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

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

+0

Когда я запускаю Qemu, я вижу, что он начинается с 0xFFFF0. Означает ли это, что Qemu по-прежнему не согласен с этим фактом, что текущие процессоры на материнских платах генерируют 0xFFFFFFF0? Или дело только в том, что разработчики Qemu не были забиты и решили пойти обычным способом «Real mode» 8086/88? – Kamalakshi

3

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

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

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

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

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

+0

Из документации, которую вы указали: 'CS-регистр загружен F000H, а базовый адрес загружен FFFF0000H'. Когда он добавляется, это 'FFFF0000 + FFF0H = FFFFFFF0H'. Как 'F000' стал' FFF0'? Перемещение 'F000' влево на 4 бита делает его' F0000', не так ли? что мне не хватает? –