Можно ли запустить процессор класса x86 без оперативной памяти?


9

Современные процессоры x86 имеют как минимум 512 Кбайт кэш-памяти второго уровня. Существуют приложения, которые полностью вписываются в этот объем памяти. Можете ли вы запустить эти чипы без оперативной памяти? Если это так, есть ли способ сделать это, который устраняет потери времени обратной записи, когда ЦП пытается поддерживать согласованность ОЗУ?

Я не имею в виду конкретного приложения, это просто праздное любопытство. Я уверен, что где-то есть нишевое приложение, где это было бы полезно.

Ответы:


12

Да, ты можешь. Подделывая чтения из последовательных (несуществующих) областей физической памяти, вы устанавливаете теги в кеше. Затем вы отключаете дальнейшее заполнение строк кеша и вводите обратную запись, ограничивая тем самым чтение / запись в кеш, и он будет вести себя как обычный ОЗУ.

Некоторые проекты по замене BIOS делают это, потому что тогда вы можете потратить гораздо больше кода на установку чипсета и контроллера памяти чипсета, так что вы можете написать его, например, на Си.

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

Для краткого введения низкого уровня вы можете проверить эту презентацию.

Обратите внимание, что, как уже отмечали другие, вам все равно нужно явно загрузить загрузочный код откуда-то.


На самом деле, я думаю, что почти все современные BIOS используют это, и почти все современные процессоры x86 имеют официальную поддержку по этой причине.
Юйхонг Бао

7

Когда процессор выходит из перезагрузки, кеш отключается. BIOS - это то, что изначально настраивает и очищает кеш. Так что нет, вы не можете запустить его без ОЗУ, потому что не хватает ОЗУ для загрузки.


1
Не могли ли первые несколько инструкций из ПЗУ инициализировать и включить кеш без использования ОЗУ?
Марк Рэнсом

1
@Mark Ransom Современные процессоры Intel (и многие другие процессоры) используют Serial Flash для хранения BIOS. Но он не может выполнить код из последовательной флэш-памяти. Вместо этого процессор копирует эту последовательную флэш-память в ОЗУ и затем выполняет ее.

Ха, мое невежество показывает - вы можете видеть, сколько лет прошло с тех пор, как я занимался проектированием оборудования. То есть процессор автоматически копирует флэш-память перед выполнением первой инструкции? Это была бы неприятная проблема курица / яйцо, которую нужно преодолеть.
Марк Рэнсом

@ Дэвид Строго говоря, это не «последовательная» флеш-память, а «Центр прошивки». Это отличается от «последовательного» в том, что он передает 4 бита за раз вместо 1.
Majenko

1
@ Mark Ransom Существует множество процессоров / MCU / DSP, которые загружаются по последовательному каналу (Serial Flash, RS-232, SPI и т. Д.). Все они достигают этого благодаря наличию небольшого ПЗУ внутри процессора, с которого он загружается, и этот код будет загружать «настоящий» код откуда угодно. Теоретически, запуск системы без ОЗУ возможен благодаря тому, что Intel модифицирует этот код, чтобы использовать кеш вместо внешней ОЗУ. Но я сомневаюсь, что Intel сделает это.

3

Я не знаю, насколько это точно, но это мои мысли:

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

Вы могли бы запустить x86 без оперативной памяти, но вы не смогли бы сделать это очень полезным. Вы будете ограничены использованием только внутренних регистров для хранения данных.


2
Протоколы заполнения и сброса кэширования тщательно документированы и настраиваются в большинстве процессоров, включая x86. Содержание кешелины не сбрасывается случайным образом между инструкциями. Посмотрите мой ответ о том, как вы обычно настраиваете его как линейную оперативную память.
Бьорн Везен

Я написал утилиту для шестнадцатеричного загрузчика для клона 80x86, который будет работать правильно без какой-либо оперативной памяти; IIRC, я реализовал одноуровневый стек вызовов, используя SP для хранения адреса возврата. Поскольку ПЗУ было на той же шине, что и ОЗУ, было не очень вероятно, что возникнет проблема, которая позволит ПЗУ работать, когда ОЗУ не работает, но в этом случае загрузчик может диагностировать проблему. На некоторых других микросхемах с внешними шинами кода, но небольшим объемом внутреннего кода, возможность запуска кода в системе со сломанной шиной была полезным диагностическим инструментом.
суперкат

@ Я могу ошибаться, но разве ОЗУ не для двоичного кода, а для чтения и записи процессором?
Виктор Мехта
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.