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

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

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

Ответы (3)

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

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

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

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

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

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

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

Не могли ли первые несколько инструкций из ПЗУ инициализировать и включить кеш без использования ОЗУ?
@Mark Ransom Современные процессоры Intel (и многие другие процессоры) используют Serial Flash для хранения BIOS. Но он не может выполнять код из последовательной флэш-памяти. Вместо этого ЦП копирует эту последовательную флэш-память в ОЗУ, а затем выполняет ее.
Ха, мое невежество проявляется - вы можете видеть, сколько лет прошло с тех пор, как я занимался дизайном оборудования. Таким образом, ЦП автоматически копирует флэш-память до выполнения первой инструкции? Это была бы неприятная проблема курицы/яйца, которую нужно преодолеть.
@David Строго говоря, это не «последовательная» вспышка, а «концентратор микропрограмм». Это отличается от «последовательного» тем, что он передает 4 бита за раз вместо 1.
@Matt Jenkins Я только что разработал печатную плату на базе процессора Intel D510 Atom и набора микросхем ICH8M. Он использует стандартный серийный флэш-чип. Но я знаю, о чем вы говорите, и вы правы в том, что некоторые чипы используют 4-битную ширину.
@Mark Ransom Есть много ЦП / MCU / DSP, которые будут загружаться по последовательному каналу (Serial Flash, RS-232, SPI и т. Д.). Все они достигают этого, имея небольшое ПЗУ внутри ЦП, с которого он загружается, и этот код загружает «настоящий» код откуда угодно. Теоретически запуск системы без оперативной памяти может быть возможен, если Intel изменит этот код для использования кэша вместо внешней оперативной памяти. Но я сомневаюсь, что Intel пойдет на это.
@David Kessner: я знаю, что редко бывает необходимо диагностировать проблемы с шиной в производственной системе ПК (если материнская плата не работает, это мусор), но я все же думаю, что для процессора было бы лучше включать только внутреннюю cache и разрешить коду настроить шину внешней памяти и/или войти в диагностический режим, если внешняя шина не работает.

Не знаю, насколько это верно, но вот мои мысли:

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

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

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