Почему первая инструкция BIOS расположена в 0xFFFFFFF0 ("верхней" части ОЗУ)?

Я знаю, что BIOS загружает свою первую инструкцию с 0xfffff0, но почему именно этот адрес? У меня куча вопросов и надеюсь, что вы можете помочь мне с некоторыми из них, по крайней мере.

мои вопросы:

  • почему первая инструкция BIOS находится в верхней части 4 ГБ оперативной памяти?
  • что произойдет, если мой компьютер имеет только 1 ГБ оперативной памяти?
  • как насчет систем С более чем 4 ГБ оперативной памяти (например, 8 ГБ, 16 ГБ, п.)?
  • почему стек инициализируется некоторым значением (в этом случае значение находится в 0xFFFFFFF0)?

Я читал об этом этим днем, и я до сих пор не понимаю.

29
задан Peter Mortensen
25.03.2023 8:07 Количество просмотров материала 3006
Распечатать страницу

7 ответов

0xFFFFFFF0-Это место, где x86-совместимый процессор начинает выполнять инструкции, когда он включен. Это жестко связанный, неизменный (без дополнительного оборудования) аспект процессора и разные типы процессоров ведут себя по-разному.

почему первая инструкция BIOS находится в верхней части 4 ГБ оперативной памяти?

Он расположен в "верхней" части 4 ГБ адресного пространства - и при включении питания BIOS или UEFI диск реагирует на чтение по этим адресам.

моя теория о том, почему это:

почти все в программировании лучше работает с последовательными адресами. Дизайнер процессора не знает, что системный строитель захочет делать с процессором, поэтому для процессора плохая идея требовать, чтобы адреса в середине пространства требовались для различных целей. Лучше держать это "в стороне" вверху или внизу адресного пространства. Конечно, имейте в виду, что это решение было принято, когда 8086 был новым, который не имел MMU.

в 8086 векторы прерываний существовали в области памяти 0 и выше. Векторы прерываний должны быть по известным адресам и желательно, чтобы быть в оперативной памяти для гибкости - пока это не было возможно для дизайнера процессора, чтобы знать, сколько оперативной памяти будет в системе. Таким образом, начиная с 0 и работая вверх имеет смысл для тех, (потому что ни одна система в 1978 году, когда 8086 был изобретен не будет иметь 4 Гб оперативной памяти-так ожидая оперативной памяти быть в 0xFFFFFFF0 не было хорошей идеей), а затем ROM должен был быть на верхней границе.

конечно, начиная с 80286, векторы прерывания могут быть перемещены в другое начальное положение, отличное от 0, но современные 64-разрядные процессоры x86 по-прежнему загружается в режим 8086, так что все по-прежнему работает старый способ для совместимости (как бы смешно это ни звучало в 2015 году по-прежнему нужна ваша x86 процессора, чтобы иметь возможность запускать Дос).

так как векторы прерываний начинаются с 0 и работайте вверх, ROM должен был бы начать сверху и работать вниз.

что произойдет, если мой компьютер имеет только 1 ГБ оперативной памяти?

32-разрядный процессор имеет 4 294 967 296 адресов, пронумерованных от 0 (0x00000000) до 4294967295 (0xffffff). ROM может жить в одних адресах, а RAM может жить в других. С MMU процессора это даже может быть включен на лету. Оперативная память не обязательно должна жить по всем адресам.

С только 1 ГБ ОЗУ, некоторые адреса не имейте что-нибудь отвечая когда они прочитаны или написаны к. Это может привести к чтению недопустимых данных при обращении к таким адресам или блокировке системы.

Как насчет систем С более чем 4 ГБ оперативной памяти (e.g: 8 GB, 16 GB, etc.)?

держать его несколько простым: 64-битные процессоры имеют больше адресов (что является одной из вещей, которая делает их 64-битными - например, 0x0000000000000000 через 0xffffffffffffff), например, поэтому дополнительная оперативная память "подходит". Принимая CPU находится в режим. А пока в памяти есть, только не адресно.

почему стек инициализируется некоторым значением (в этом случае значение находится в 0xFFFFFFF0)?

Я не могу сразу найти что-либо на то, что x86 назначает указатель стека при включении питания, но в конечном итоге он должен быть переназначен подпрограммой инициализации в любом случае, как только эта процедура узнает, сколько оперативной памяти в системе. (@Eric Towers в комментариях ниже отчетов что он установлен на ноль при включении питания.)

52
отвечен LawrenceC 2023-03-26 15:55

Он не расположен в верхней части оперативной памяти; он расположен в ПЗУ, адрес которого находится в верхней части адресного пространства памяти, наряду с любой памяти на картах расширения, как контроллеры Ethernet. Он там, так что он не будет конфликтовать с оперативной памятью, по крайней мере, пока у вас не будет установлено 4 ГБ. Системы с объемом ОЗУ 4 ГБ и более могут выполнять две задачи для разрешения конфликта. Дешевые материнские платы просто игнорируют части оперативной памяти, которые конфликтуют с тем, где находится ПЗУ. Достойные из них переназначить, что ОЗУ появляться имеет адреса выше 4 ГБ.

Я не уверен, что вы спрашиваете о стеке. Это, конечно, не инициализируется, чтобы быть в ROM. Когда процессор перезагружается, он изначально находится в" реальном режиме", где он действует так же, как оригинальный 8086 и использует 16-битную сегментированную адресацию, позволяя ему только получить доступ к 1 МБ памяти. Код BIOS расположен в верхней части этого 1 МБ. BIOS выбирает место в оперативной памяти для настройки стека и загружает и выполняет первый сектор первого загрузочного диска. это до ОС, чтобы переключиться в 32 или 64-разрядный режим, как только он берет на себя и настроить свои собственные стеки (по одному на задачу/поток).

24
отвечен psusi 2023-03-26 18:12

во-первых, это не имеет никакого отношения к оперативной памяти, на самом деле. Мы говорим о адресного пространства здесь-даже если у вас только 16 Мб памяти, у вас все еще есть полные 32 бита адресного пространства на 32-разрядном процессоре.

Это уже отвечает на ваш первый вопрос, на самом деле - в то время, когда это было разработано, у реальных ПК не было почти полных 4 Гб памяти; они были больше в диапазоне 1-16 Мб памяти. Адресное пространство было, во всех смыслах и целях, бесплатный.

теперь, почему именно 0xFFFFFFF0? Процессор не знает, сколько BIOS существует. Некоторые Биозы могут занимать всего несколько килобайт, в то время как другие могут занимать полные мегабайты памяти - и я даже не попадаю в различные дополнительные ОЗУ. Процессор должен быть жестко на какой-нибудь адрес, чтобы начать там noöne для настройки процессора. Но это только отображение адресного пространства-адрес отображается непосредственно в микросхему BIOS ROM (да, это означает, что вы не получите доступ к полной 4 Гб оперативной памяти на данный момент, если у вас есть так много, но это не что - то особенное, многие устройства требуют своего собственного диапазона в адресном пространстве). На 32-битном процессоре этот адрес дает вам полные 16 байт, чтобы выполнить самую простую инициализацию-этого достаточно для настройки ваших сегментов и, при необходимости, адресного режима (помните, x86 загружается в 16-битном реальном режиме - адресное пространство не является плоским) и сделайте переход к реальные загрузки "процедуры". На данный момент Вы вообще не используете оперативную память - все просто сопоставлено ЦЫГАН. На самом деле, RAM даже не готов к использованию на данный момент - это одна из задач BIOS POST! Теперь вы можете подумать - как 16-битный реальный режим получает доступ к адресу 0xFFFFFFF0? Конечно, есть сегменты, поэтому у вас есть 20-битное адресное пространство, но этого все еще недостаточно. Ну, есть трюк - 12 высоких бит адреса устанавливаются до тех пор, пока вы не выполните свой первый длинный прыжок, предоставляя вам доступ к высокому адресному пространству (при отказе доступа к чему-либо ниже 0xFFF00000 - пока не выполните прыжок в длину).

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

так что более приятное представление исходит из старой школы кодирования на MS DOS. Еще один типичный пример прямого сопоставления памяти устройства с адресное пространство-это прямой доступ к видеопамяти. Например, если вы хотели быстро написать текст на дисплей, вы писали непосредственно по адресу B800:0000 (плюс смещение - в текстовом режиме 80x25, это означало (y * 80 + x) * 2 если мне не изменяет память-два байта на символ, построчно). Если вы хотели рисовать пиксель за пикселем, вы использовали графический режим и начальный адрес A000:0000 (типично, 320x200 на 8 битах в пиксел). Делать что-нибудь высокопроизводительное обычно означало погружение в Руководства по эксплуатации устройств, чтобы понять как получить к ним прямой доступ.

этот и по сей день - это просто скрытые. В Windows, вы можете увидеть адреса памяти, сопоставленные с устройствами в Диспетчере устройств-просто откройте свойства что - то вроде вашей сетевой карты, перейдите на вкладку ресурсы-все элементы диапазона памяти отображения из памяти устройства в основное адресное пространство. И на 32-битной, вы увидите, что большинство из этих устройств отображаются выше 2 гиб (позже 3 гиб) знак-снова, чтобы свести к минимуму конфликты с пользовательская память, хотя на самом деле это не проблема с виртуальной памятью (приложения не приближаются к недвижимость, оборудование адресное пространство - у них своя виртуальных кусок памяти, который может быть сопоставлен с ОЗУ, ПЗУ, устройства или файла подкачки, например).

Что касается стека, ну, это должно помочь понять, что по умолчанию стек растет сверху. Так что если вы делаете push новый указатель стека будет находиться на 0xFFFFFEC - другими словами, вы не попытка записи в адрес инициализации BIOS:) что, конечно, означает, что процедуры инициализации BIOS могут безопасно использовать стек, прежде чем переназначать его где-то более полезным. В старой школе программирования, прежде чем подкачка стала фактическим значением по умолчанию, стек обычно запускался в конце оперативной памяти, и" переполнение стека " происходило, когда вы начали перезаписывать память приложения. Защита памяти изменила многое из этого, но в целом она поддерживает обратную совместимость насколько это возможно-обратите внимание, как даже большинство современных x86-64 процессоров могут все еще загружается MS DOS 5 - или как Windows может запускать множество приложений DOS, которые понятия не имеют о подкачке.

11
отвечен Luaan 2023-03-26 20:29

В дополнение к другим упомянутым пунктам, это может быть полезно, чтобы понять, что адрес is. В то время как более новые архитектуры усложняют ситуацию, исторически машина будет на каждом цикле памяти выводить желаемый адрес на 20-32 проводах (в зависимости от архитектуры, с некоторыми специальными трюками, чтобы отметить, нужна ли она паре или четверке байтов одновременно); различные части системы памяти будут изучать состояние этих проводов и активировать себя, когда это необходимо. они увидели определенные сочетания высоких и низких значений.

Если машине с 32 проводами адреса только было нужно использовать 1МБ рам и 64КБ [вполне правдоподобно для некоторых встроенных контроллеров] он может активировать ОЗУ для всех адресов, где провод верхнего адреса был низким, и ПЗУ для всех адресов, где он был высокий. Нижние 20 адресных проводов затем быть привязаны к оперативной памяти, чтобы выбрать один из 1,048,576 байт и нижней 16 будет подключен к ПЗУ, а также, чтобы выбрать один из 65,536 байты. Оставшиеся 11 адресных проводов просто не будут подключены к что угодно.

на такой машине доступ к адресам 0x00100000-0x001FFFFF будет эквивалент доступа к адресам ОЗУ 0x00000000-0x000FFFFF. Также с адресами 0x000200000-0x0002FFFFF, или 0x7FF00000-0x7FFFFFFFF. Адреса выше 0x80000000 будут все читать ПЗУ, с шаблоном 64K повторяется по всему пространству.

даже при том, что процессор имеет адресное пространство 4,294,967,296 байт, есть отсутствие потребности иметь оборудование узнать что много определенных адресов. Ставящий вектор сброса в верхней части адресного пространства-это хорошо работать независимо от того, сколько или как мало оперативной памяти и ПЗУ системы полностью декодирует адресное пространство.

5
отвечен supercat 2023-03-26 22:46

мой teory потому, что мы используем отрицательную логику цифровой (1) нет напряжения вообще (o вольт) мы только должны поставить напряжение на последних 4 бит при инициализации так счетчик программы (или указатель инструкции) шнурует на 1111 1111 1111 1111 1111 1111 1111 0000. Нам не нужно обращаться к верхним 28 битам, так как большинство (старых) процессоров были 16 битами, а нижние кусочки могут быть адресованы одним чипом адреса в старые времена. Теперь, так как у нас есть 64 бит с совместимостью до 32 бит и 32 бит к 16 бит, аппаратно couild были улучшены, но метод остается. Также bioses не всегда 64 или 32 запрограммированных бита. Мое мнение также, поскольку воспоминания не всегда одинаковы, bios должен находиться в одном и том же первом сегменте. Как мы видим БИОС имя не реальный адрес все время. Просто научил меня этому ...

2
отвечен Agguro 2023-03-27 01:03

при сбросе 8088/8086 совместимый процессор выполняет инструкции на 0FFFF0, что на 16 байт ниже предела в 1 мегабайт. обычно ПЗУ в этом месте (в реализациях ПК) будет BIOS, поэтому в конце ПЗУ BIOS есть переход к началу ПЗУ BIOS.

показанный здесь: начните вектор и подпись "даты" за ей, IBM 5150 PC 8kb EPROM dump bios дата: 10/19/1981

00001FEE  FF                db 0xff
00001FEF  FF                db 0xff
00001FF0  EA5BE000F0        jmp word 0xf000:0xe05b
00001FF5  3130              xor [bx+si],si
00001FF7  2F                das
00001FF8  3139              xor [bx+di],di

обратите внимание, что адресация 8kb $ 2000 rom, который помещает начальный адрес (абсолютный дальний JMP, в любое другое место, в этом случае в самом 8kb rom, хотя и не самый низкий возможный адрес в этом ПЗУ) в $FFFF:$0 сегментированный или $ffff0 линейный.

что касается совместимости: если какой-то "будущий" или текущий процессор "ожидает", что перед адресом будет намного больше F, это не имеет значения. для совместимости новых процессоров в старых системах дополнительные адресные строки остаются несвязанными и, следовательно, база данных точно такая же. пока младшие значащие биты остаются FFFF0.

(в системе с 1 МБ ОЗУ и ПЗУ, расположенным в конце этой ОЗУ, и больше ничего, он с радостью "подумает", что разговаривает с более высоким адресом, но получает те же самые данные, потому что эти реализации никогда не слышали об адресных строках выше A19)

обратите внимание, что мир-это не просто "ПК"... ibm pc был "случайностью", эти процессоры никогда не были специально предназначен для "ПК" и входит в целую кучу больше вещей, чем просто ПК (например, спутники, системы оружия и т. д.). Защищенный режим 32 и 64bit обычно-не-пожелан. (виртуальный режим 8086 намного интереснее, как причина, чтобы выбрать более новую (386+) версию, например). поэтому существует гораздо больше "обратной совместимости", чем просто "будет ли он работать dos".

1
отвечен HRH Sven Olaf von CyberBunker 2023-03-27 03:20

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

0
отвечен viktorkh 2023-03-27 05:37

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

bios
boot
kernel
memory
Вверх