во-первых, это не имеет никакого отношения к оперативной памяти, на самом деле. Мы говорим о адресного пространства здесь-даже если у вас только 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, которые понятия не имеют о подкачке.