Как BIOS инициализирует DRAM?

Я уже довольно давно искал объяснение того, как именно работает BIOS. Я разработал загрузчик и перешел с ним в 32-битный режим при успешной инициализации IDT, а также GDT, но при этом я обнаружил, что операционные системы кажутся довольно простыми, и ощущение, что BIOS - это актуальная операционная система каждого компьютера.

Итак, теперь я взял на себя новую задачу - попытаться выяснить, как BIOS на самом деле инициализирует себя, обнаруживает, сколько оперативной памяти можно использовать, и как / где ПЗУ карты расширения импортируется в оперативную память. Насколько я понимаю, процессор не через скачок, а автоматически начинает выполнение кода внутри ОЗУ в 16-битном сегменте: адрес смещения 0xFFFF: 0x0000. Это означает, что все компьютеры технически должны иметь изначально как минимум 1 МБ ОЗУ, чтобы они могли загружаться, из-за начального местоположения процессора, и из-за этого знания я предполагал, что все BIOS автоматически записываются в ОЗУ до того, как процессор получает свой сигнал RST. Я считаю, что это неправда, так как это именно то, чем является Shadow BIOS, который, как мне кажется, можно отключить через BIOS. Я повсюду искал Руководство разработчика BIOS, однако я продолжаю выходить с пустыми руками с каждой спецификацией, которую, кажется, читал.

Как программист, я понимаю, что, вероятно, существует множество способов на самом деле выполнить то, о чем я на самом деле прошу, и что, вероятно, в аду нет никакого способа дать достойный прямой ответ, и, если я должен быть более конкретным, скажем, что я работал с Dell Inspiron 518 или, по крайней мере, с компьютером, содержащим набор микросхем G33 (северный мост G33 и южный мост ICH9), и я хотел запрограммировать начальную программу Pre-POST и создать свой собственный 16-битный IDT со всеми стандартными прерываниями и все необходимое, что потенциально могло бы успешно загрузить другую операционную систему, такую ​​как Windows 10. Откуда BIOS на самом деле знает, сколько там оперативной памяти? Он просто выполняет проверку битовой записи и чтения битов в самых высоких областях памяти, а оттуда спускается вниз? И как ROM карт расширения вообще загружается в RAM? Насколько я понимаю, BIOS формирует очень простой список прерываний и / или точек входа, которые могут использовать ПЗУ карты расширения, и дает им возможность фиксироваться на других прерываниях BIOS, таких как $ PMM? И как производители BIOS знают, какие именно строки привязки необходимы в их BIOS для загрузки такой операционной системы, как Windows?

Были бы очень полезны любые ответы, а также любые рекомендуемые спецификации и / или любые руководства, которые могли бы привести меня к знаниям, которые я искал. Например, может быть, руководство, указывающее минимально необходимые процессы, которые должны быть выполнены BIOS перед передачей IPL? или даже пример исходного кода на C или Assembly с чем-то, что может показать мне, что на самом деле представляет собой или как выглядит образ ROM карты расширения, было бы очень полезно.


person GodDamn    schedule 29.07.2020    source источник
comment
как если бы BIOS ЯВЛЯЕТСЯ реальной операционной системой каждого компьютера. - только если вы напишете игрушечное ядро, которое использует только вызовы BIOS, вместо реальных драйверов для реального оборудования, которое действительно есть на компьютере. Особенно, если это скорее автономная программа, а не полноценная ОС с управлением процессами. Это правда, что BIOS действительно должен инициализировать такие важные вещи, как тайминги DRAM, используя режим cache-as-RAM (без заполнения) перед загрузкой загрузчика UEFI или legacy-BIOS-MBR с диска. Но правильная ОС займет всю память, включая всю память, которую использовал BIOS; BIOS просто загружает HW и не остается активным.   -  person Peter Cordes    schedule 29.07.2020
comment
Это действительно зависит от чипсета. На старых машинах оперативная память действительно была доступна при загрузке. На более современных машинах ЦП фактически запускается в специальном режиме кэш-памяти, в котором внешняя оперативная память не используется. Кроме того, современные процессоры в реальном режиме не запускаются с ffff:0000. BIOS скрывает от вас многое из этого.   -  person fuz    schedule 29.07.2020
comment
(Конечно, в режиме управления системой прерывания SMI все еще могут делать что-то за спиной реальной ОС, поэтому не всегда полностью верно, что BIOS не продолжает работать после загрузки ОС, такой как Linux.)   -  person Peter Cordes    schedule 29.07.2020
comment
@fuz, не понимаю, что вы здесь имеете в виду. Согласно SDM, процессоры Intel запускаются в реальном режиме с cs = f000 (cs.base = fffff000) и ip = fff0. Вы хотите сказать, что это не так?   -  person prl    schedule 29.07.2020
comment
@prl Я слышал, что некоторые процессоры x86 действительно запускаются в защищенном режиме, а позже BIOS выходит в реальный режим для совместимости. Хотя не уверен.   -  person fuz    schedule 29.07.2020
comment
@fuz После включения или перезагрузки процессор Intel x86 будет в реальном режиме (см. главу 9, Управление процессором и инициализация в томе 3, Руководство по системному программированию, Intel Руководства разработчика программного обеспечения) и начнет выполнение с F000: FFF0. IIRC, процессор 80286 мог войти в защищенный режим только через сброс (а затем больше не мог выйти из него), но все необходимые таблицы и т. Д. Были бы настроены до сброса.   -  person 1201ProgramAlarm    schedule 29.07.2020
comment
Когда появляется что-то вроде uefi, чтобы изменить то, как что-то делается, вовлекаются все заинтересованные стороны со всех сторон этого интерфейса (пользователи boot / bios, люди материнской платы, люди операционной системы). И это действительно так, как все это работает в отношении этого вопроса (производители BIOS и Windows). Некоторые из них образуют стандарт, и каждый пытается соответствовать этому стандарту. Со стороны BIOS это просто история обратной совместимости с добавлением новых вещей, часть черной магии создания материнской платы.   -  person old_timer    schedule 29.07.2020
comment
@old_timer: защищенный режим имеет особое техническое значение на x86, отдельный от более или менее защищенного. Это означает, что защита возможна, а не что что-то недоступно. Если гипотетически 386 загрузился в защищенном режиме (с определенными значениями по умолчанию для сегмента базы / ограничений / разрешений, разбиение на страницы отключено, кольцо 0), вы все равно можете легко выйти из защищенного режима и вернуть ЦП обратно в унаследованный реальный режим. Или просто оставайтесь в кольце 0 (режим ядра), где вы можете выполнить любую привилегированную инструкцию. Да, было бы разумно запустить только в кольце 0 (режим ядра), но это не то, что кто-то сказал.   -  person Peter Cordes    schedule 29.07.2020
comment
@ 1201ProgramAlarm: IIRC, база CS на самом деле намного выше, чем F000 << 4, поэтому современные x86 фактически загружаются в нереальном режиме. Но это неофициальное название для работы в реальном режиме с базами сегментов, которые не соответствуют значениям и / или ограничениям сегментных регистров, отличным от 64k. Так что да, технически правильно называть этот режим реальным.   -  person Peter Cordes    schedule 29.07.2020
comment
@PeterCordes, да, я был рядом, когда он вышел, был очень силен с 8086/88, но с тех пор исчез в Arm и других, как вы знаете. Мой комментарий должен был быть общим, несмотря на конкретное значение защищенного режима в мире x86. комментарий удален ...   -  person old_timer    schedule 29.07.2020
comment
@prl Последние (серверные?) процессоры Intel начинают выполнять код внутри процессора, который проверяет специальный блок кода в прошивке, предоставленной Intel производителю материнской платы. Затем выполняется этот специальный код, который затем формирует основу доверия для технологии Intel Trusted Execution. Затем этот специальный код начинает нормально выполнять прошивку в реальном режиме с CS.base = 0xFFFFFFF0 и EIP = 0. Я не уверен, задокументирован ли он, в каком режиме ЦП работает до этого.   -  person Ross Ridge    schedule 30.07.2020
comment
В руководстве по набору микросхем Intels G33 в самом верху страницы 58: ​​intel.com/ Assets / PDF / datasheet / 316966.pdf 3.1.5 Область системного BIOS (F_0000h-F_FFFFh) Эта область представляет собой один сегмент размером 64 КБ (000F_0000h - 000F_FFFFh). Этому сегменту можно назначить атрибуты чтения и записи. По умолчанию (после сброса) чтение / запись отключены, а циклы перенаправляются на интерфейс DMI. Управляя атрибутами чтения / записи, (G) MCH может «затенять» BIOS в основной DRAM. Когда отключено, этот сегмент не отображается повторно. Доступы без отслеживания из PCI Express или DMI к этой области всегда отправляются в DRAM.   -  person GodDamn    schedule 30.07.2020
comment
При этом процессор мог бы честно изготавливаться любым способом, который производитель считает нужным, если он загружается и начинает выполнение кода в пределах этого диапазона адресов, что, по сути, вызовет перенаправление в ПЗУ BIOS.   -  person GodDamn    schedule 30.07.2020
comment
Кроме того, операционной системе без BIOS было бы очень сложно обнаружить карты памяти и т. Д. если его нет, скажите BIOS INT 15h, AX E820h, чтобы сообщить ему любую информацию о компьютере, которую он должен знать. Без BIOS операционная система должна быть запрограммирована специально для конкретного компьютера, а не спроектирована таким образом, чтобы отделить знания об оборудовании от операционной системы, что позволило бы ей работать на нескольких разных платформах, а не только на одном ПК.   -  person GodDamn    schedule 30.07.2020
comment
Привет! У меня есть руководство Pentium Pro BIOS Writer, и я могу поделиться им с вами! Если хочешь! : D   -  person    schedule 28.09.2020
comment
Однажды я обнаружил руководства AMD, и у них есть руководства для разработчиков BIOS и ядра (BKDG) для каждого семейства / модели ЦП, которые можно получить с помощью CPUID где-то, лист 2, я полагаю, внутри eax или что-то в этом роде. Я не знаю. Честно говоря, мне кажется, что этот вопрос довольно глупый, но, вероятно, у него есть структура в ПЗУ или что-то в этом роде, и установка где-то в PCI, как мне кажется, и бит ПЗУ внутри PCI читается из ПЗУ, записывается в ОЗУ при загрузке по умолчанию? Мля кто знает? .. Но спасибо за предложение! :)   -  person GodDamn    schedule 16.04.2021


Ответы (2)


Я ограничиваю этот ответ архитектурами Intel, поскольку я в основном знаком с ними.


Документ, который вы (а также я) ищете, называется BIOS Writer Guide и, к сожалению, является конфиденциальным и пока не просочился (AFAIK).

Чтобы продвигать свой продукт в сообществе открытого исходного кода, Intel выпустила Пакет поддержки микропрограмм. Это следует рассматривать как библиотеку для разработчиков микропрограмм и содержит (двоичный) код для инициализации контроллера памяти, PCH (Peripheral Controller Hub, неофициально известный как набор микросхем) и CPU 1 .
Разработчик с открытым исходным кодом или вообще любой разработчик, который не может позволить себе подписать NDA с ​​Intel, может использовать FSP для написания собственной прошивки.

Можно отменить FSP (один из многих моих TODO), но его быстрее использовать в качестве справочного материала.

Когда включается питание, многое происходит до того, как ЦП начинает выполнение из вектора сброса 2, но важно помнить, что набор микросхем (т.е. PCH) уже позволяет ЦП получить доступ к флеш-ПЗУ.
Фактически, именно так и выполняются первые инструкции, поскольку ЦП может извлекать инструкции только из адресного пространства памяти.

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

Поскольку память еще не инициализирована и флэш-ПЗУ доступна только для чтения (с учетом циклов записи в память), эти функции не могут быть использованы:

  • звонки. Поскольку им нужен записываемый стек.
  • переменные в памяти. Поскольку они, ну, различаются.

Оба являются неприятными моментами, в сборке вы можете использовать переходы и регистры, чтобы обойти их, но в C вы не можете этого сделать.
Итак, первое, что делает прошивка, обычно устанавливает временную RAM.
Это TempRamInit() подпрограмма FSP (которая, кстати, должна вызываться с переходом), и на практике она устанавливает Cache-as-RAM (CAR).

Кэш-как-ОЗУ

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

Однако это потребует тщательного позиционирования переменных, и это действительно очень хрупко.
Лучше включить кеш (очистив бит CD (Cache Disable) в регистре CR0), а затем выполнить фиктивное чтение (или даже , пишет) из области памяти размером с L1 3.
Затем вы снова отключаете кеши, этот режим на самом деле известен как режим без заполнения, где новые строки не помещаются в кеш (поэтому ни одна существующая строка не может быть потеряна), но чтение и запись все еще могут попадать в кеш.

Это позволяет выделить несколько КиБ ОЗУ.
Существуют компиляторы C для сред CAR.

Инициализация ОЗУ

Теперь прошивка может инициализировать ОЗУ, для этого необходимо сделать три вещи:

  1. Сообщите контроллеру памяти тайминги DIMM (CAS, RAS вообще).
  2. Сообщите контроллеру памяти размер и рейтинг модулей DIMM.
  3. Установите маршрутизацию.

Контроллер памяти настраивается через пространство конфигурации PCI и MMIO, подробности можно найти в томе 2 таблицы данных процессора (при условии, что MC находится в кристалле ЦП).
Например, Технические данные ядра 8-го и 9-го поколений vol 2 содержит описание регистров контроллера памяти. Вот отрывок, в котором прошивка может установить параметр tRAS:

Пример регистров МК

Аналогичным образом вы найдете регистры для размера и типа модулей DIMM, размера канала и так далее:

«Другой  Еще один

Эти регистры охватывают точки 1 и 2 (и немного точки 3, в зависимости от определения), но как прошивка может знать, какие значения использовать?
В конце концов, модули DIMM можно заменить.

Как уже отмечалось, решением является Serial Presence Detect (SPD), небольшой EEPROM встроена в сами модули DIMM и описывает тайминги, топологию и размер памяти.

Доступ к EEPROM осуществляется с помощью шины, совместимой с I2C.
В архитектуре Intel фактически используемой шиной является SMBus (шина системного управления), которая совместима с I2C и была создана соответствующим образом.
Мастер SMBus найден в PCH и задокументировано в томе 2 таблицы данных соответствующей серии.
Например, PCH series 200 datasheet vol 2.

Мастер SMBus должен быть настроен перед использованием, но это очень просто. После настройки его можно использовать для чтения данных SPD.
Это работает точно так же, как доступ к любому другому устройству I2C.
SPD EEPROM (их может быть несколько, конечно, по одному на DIMM) зарезервированы адреса от 0x50 до 0x57 (в серии 200 PCH).
Можно записать в SPD, и в мастере SMBus есть бит для отключения такого поведения:

SPD write disable

После считывания данных SPD можно настроить MC, а затем использовать RAM.

Это процедура FspMemoryInit () FSP.

Последний шаг - настройка маршрутизации.
Это включает настройку конца области RAM в адресном пространстве памяти (полное изображение см. В таблице данных PCH), а в системе NUMA - адрес источника и цель. Декодер адресов для маршрутизации запросов к памяти через сокеты через каналы QPI / UPI.
Все это осуществляется через конфигурационное пространство PCI интегрированных устройств в PCH.

В системах NUMA необходимо загрузить другие прикладные процессоры (по одному на сокет), чтобы настроить и их контроллеры памяти.
Это делается с помощью межпроцессорных прерываний (IPI), выдаваемых через LAPIC, который является компонентом MMIO в каждом ЦП. .

Резюме

Приблизительные шаги, выполняемые прошивкой:

  1. Выполните любую базовую инициализацию среды (например, переключитесь в 32-битный режим).
  2. Инициализировать кэш-память.
  3. Инициализируйте мастер SMBus в PCH, используя перечисление PCI.
  4. Прочтите SPD EEPROM каждого модуля DIMM.
  5. Настройте контроллер памяти каждого сокета с данными SPD.
  6. Настройте карту памяти PCH.
  7. Настройте маршрутизацию NUMA.

1 ЦП не нуждается в инициализации, фактически, к моменту вызова процедуры инициализации FSP большой объем кода уже был выполнен. Вероятно, они имели в виду тонкую настройку какой-то, более или менее задокументированной функции.

2 Они не будут здесь обсуждаться, но, вкратце, встроенный контроллер (для ноутбуков, проводная логика для настольных компьютеров) будет включен, после загрузки (с использованием встроенного ПЗУ) его прошивка будет использовать GPIO для включить необходимые силовые вентили щита. Один из этих ворот питает PCH, который, как только прошивка EC устанавливает правильный контакт, загружает свою собственную прошивку (которая известна как прошивка Management Engine, потому что она связана с остальной частью кода ME внутри области ME той же флэш-памяти. ПЗУ, которое также содержит код BIOS, но технически это модуль Bring-Up, BUP) и сбросить набор микросхем. Как только набор микросхем будет готов, он установит вывод хорошего питания ЦП, а затем выводы сброса / инициализации, которые заставят ЦП начать выполнение POST, а затем, при условии, что ЦП поддерживает TXT, микрокод для выборки Таблица интерфейса микропрограмм из флэш-ПЗУ и из него SINIT ACM (модуль управления с проверкой подлинности системы, который настроит безопасность, необходимую для измеренного запуска) и, при необходимости, BIOS ACM (который будет выполнять функцию поставщика конкретные задачи, включая загрузку, пропуск устаревшего вектора сброса). В конце концов, BIOS ACM (или микрокод, если BIOS ACM не найден в FIT) перейдет к вектору сброса. Это устаревший процесс загрузки. Обратите внимание, что ACM выполняются в специально созданной среде, которая использует кэш-память (см. Выше), следуя семантике любого другого запуска TXT (см. Спецификации Intel TXT).

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

person Margaret Bloom    schedule 30.07.2020
comment
Спасибо за всю эту информацию и базовое упрощенное пошаговое описание! Очень и очень информативно! Большое спасибо! Я принял это как ответ на Old_Timers из-за пошаговой информации, которую вы поделились! Однако у него тоже был ответ на правильный путь! Если у вас есть какие-либо рекомендуемые спецификации, материалы для чтения или руководства, относящиеся к теме «Разработка BIOS», я определенно приветствую вас, если вы захотите поделиться любой имеющейся у вас информацией. Еще раз спасибо за всю информацию, которой вы поделились! - person GodDamn; 30.07.2020
comment
@GodDamn Таблицы данных, вероятно, являются наиболее полезными документами наряду со стандартами. Хороший метод - разобрать старый компьютер и найти таблицу данных каждого отдельного чипа и использовать Google, чтобы увидеть, как все они сочетаются друг с другом. К сожалению, нет ни одного документа, хотя OSDev является хорошей отправной точкой. - person Margaret Bloom; 31.07.2020
comment
Полный процесс инициализации памяти для процессора SKL-SP ​​описан в разделе 5 этот документ. Теневой BIOS, о котором спрашивал ОП, создается сразу после инициализации путем копирования прошивки из NVRAM в память. Мне не совсем ясно, что перед входом в режим CAR необходимо получить доступ к памяти для выделения строк в кеше. Как эти обращения обрабатываются еще не инициализированным контроллером памяти? Может быть, он просто возвращает мусорные значения. - person Hadi Brais; 01.08.2020
comment
@HadiBrais У меня нет доказательств, но я уверен, что контроллер памяти возвращает значения мусора (возможно, значение «все единицы», например, при чтении несуществующей памяти). В конце концов, не имеет значения, что он возвращает при настройке CAR, важно установить линии в состояние E или M. Спасибо за документ, очень интересно! - person Margaret Bloom; 01.08.2020
comment
Привет! У меня есть руководство Pentium Pro BIOS Writer, и я могу поделиться им с вами! Если хочешь! : D - person ; 28.09.2020
comment
@FryRon Большое спасибо, но я думаю, что это уже старовато. От этой архитектуры сегодня почти ничего не осталось. Но я ценю предложение :) - person Margaret Bloom; 28.09.2020
comment
Ok! Кстати! : DDDDD - person ; 28.09.2020

Короткий ответ...

В настоящее время термин BIOS используется неправильно. Но когда вы покупаете BIOS у AMI и т. Д., Он загружает микросхему / систему, а также предоставляет устаревшие базовые службы ввода / вывода через программные прерывания.

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

Модули Dram содержат EEPROM с данными SPD (стандарт JEDEC), которые, помимо прочего, сообщают загрузчику, сколько там драмов. Так загрузчик (BIOS) знает, сколько оперативной памяти.

Что касается UEFI или даже BIOS, если на то пошло, поставщиков BIOS, поставщиков материнских плат, поставщиков операционных систем, в их интересах продвигать этот уникальный стандарт совместимости с ПК, будь он формальным или нет. UEFI изменил ситуацию сначала благодаря Intel (EFI), но затем в сообществе. Устаревший режим BIOS, я бы сказал, вероятно, поддерживался / применялся Microsoft и Intel для разработчиков BIOS / материнских плат, поскольку они не были бы в бизнесе, если бы рассердили эти компании.

TL;DR

Поймите, что существует тесная связь между конкретной материнской платой и BIOS на ней. Когда вы разрабатываете материнскую плату, несомненно, есть много общего в мире ПК, в мире конкретных микросхем / сокетов Intel или AMD. Но все же есть причина, по которой вы делаете еще одну материнскую плату. Из-за истории и различных причин существует очень и очень небольшое количество поставщиков BIOS, если вы хотите иметь хорошие шансы на успех, вы просто звоните одному и платите столько, сколько вам нужно, и получаете BIOS. Это не похоже на то, что я купил компьютер и, не обсуждая его ни с кем, решил запустить на нем windows, bsd, Linux или что-то еще. Производитель процессора / чипа (Intel или AMD), поставщик BIOS (ami, insyde, phoenix и т. Д.) И вы, создатель материнской платы, имеете трехсторонние отношения, если есть надежда на успех. Есть также причина, по которой производителей материнских плат относительно мало.

То, что делает и предлагает BIOS, также имеет историю, о которой я не буду вдаваться в подробности.

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

DRAM / DDR - это беспорядок, для правильной работы могут потребоваться недели или месяцы, это не обязательно тривиальная задача (новый IP и т. Д., Существующий / известный IP и соответствующий дизайн макета платы, может быть, часы или дни). В любом случае из-за стоимости и истории мы привыкли к тому, что наш драм представляет собой подключаемые модули, поэтому как вы знаете, что там есть, и, возможно, это ваш вопрос. Если вы выполните поиск последовательного обнаружения присутствия в Википедии, вы увидите спецификацию JEDEC для информации, предоставляемой модулем контроллеру / хосту. В модуле на известной шине (я полагаю, i2c) есть EEPROM или эквивалент, который содержит информацию SPD для этого модуля. Из этой информации вы узнаете не только объем памяти, но и несколько настроек времени, необходимых для работы драма для конкретных чипов драма в этом модуле (и технологии / поколения DRAM DDR2, DDR3, DDR3L и т. Д.). Ранг / банк, ширина и т. Д. Он также будет включать от одной до нескольких возможных скоростей.

Программное обеспечение на стороне хоста, которое мы объединяем в термин BIOS (подумайте о загрузчике), которое имеет глубокие знания о материнской плате и процессоре или действующих процессорах, которые будут работать. А также знание того, на что способен контроллер dram, и соответствие одной из возможных комбинаций, рекламируемых модулем dram. Так, например, модуль может поддерживать 2133, но хост-контроллер может поддерживать только до 1666, если эта скорость поддерживается модулем или скоростью, которую он будет пробовать.

Естественно, что BIOS - это не какая-то ручная сборка, которая не требует оперативной памяти и полагается только на регистры общего назначения. Так что да, где-то должна быть какая-то SRAM, я не знаю эти чипы Intel на этом уровне (опять же, очень очень немногие люди используют эти чипы таким образом), если вы посмотрите на чипы ARM с поддержкой Linux, на них есть sram чипсы. Микросхема (не x86), с которой я знаком, кеш-память dram может использоваться как прямой доступ для такого рода работы вместе с некоторыми другими sram-памятью на кристалле, поэтому микросхема может быть загружена с использованием этих srams-файлов на кристалле (используется для стека и данных. , запустите код из флеш-памяти или также для запуска кода из зависимости), затем, когда dram закончен, кеш перенастраивается как кеш, и теперь dram становится доступным. Затем загрузчик завершает свою работу, а затем ищет носитель, содержащий операционную систему, загружает и запускает ее.

IMO становится все проще, например, сделать материнскую плату AMD, когда я лично не видел, чтобы Intel подошел. Они оба объединяют больше ранее существовавших многочиповых решений в один чип / многокристальный модуль. Существует много черной магии, если вы основываетесь на истории, связанной с производством материнских плат. Можно было бы ожидать, что Intel или AMD будут иметь подробную информацию, необходимую для понимания этого, но является ли она общедоступной (сколько людей делают материнские платы, сколько людей пишут BIOS, как люди, готовые платить за контракты на поддержку, сколько людей желающих купить макетные платы / эталонные дизайны). В любом случае, если есть общедоступная информация, вам нужно начать с Intel или AMD. Ожидайте, что некоторый процент ответов будет общим для нескольких поколений этих продуктов, а также некоторые ответы могут быть специфичными для одного конкретного продукта.

So:

Имеется флэш-память, которая содержит загрузчик, а конструкция платы такова, что она соответствует требованиям загрузки процессора, чтобы вывести содержимое флэш-памяти перед загрузкой процессора. Да, действительно должны быть какие-то sram на чипе, чтобы помочь в процессе загрузки. Как вы определяете, сколько драма основано на знании характеристик / параметров чипа драма и контроллера. Для подключаемых модулей, к которым мы привыкли, есть небольшой eeprom или аналогичный, который содержит данные SPD для модуля / микросхем на модуле, так что загрузчик знает не только общий объем оперативной памяти, но и многие параметры синхронизации, необходимые для разговора. к этому драму правильно.

Предположительно существуют некоторые BIOS с открытым исходным кодом, если я правильно помню, они немного устарели и, вероятно, ограничены тем, какие материнские платы, если они поддерживают, могут быть просто фактическим BIOS, реализующим вызовы BIOS, а не полномасштабным загрузчиком x86, предназначенным для поднимая материнскую плату. Обычно BIOS / загрузчик - это то, что вы просто покупаете у AMI или insyde и т. Д., Процессор, который вы выбрали для разработки, может определять, какого поставщика или поставщиков BIOS выбрать. Исходный код ami bios или другого имеет высокую цену, а также длительное юридическое соглашение. Вероятно, включая некоторую форму, если вы потеряете / утечите код, который вы соглашаетесь предоставить, это опустошение вашего банковского счета для устранения утечки. Я подозреваю, что флэш-память читаема, и вы можете попытаться ее реконструировать, но я также подозреваю, что это скомпилированный код, а не написанный вручную asm, поэтому его будет не так легко читать. Лучше всего просто понять процесс и оставить все как есть.

Если вы действительно хотите испытать этот переход от x86 и перейти на ARM, поскольку есть загрузчики с открытым исходным кодом, документация в некоторой степени по логике (контроллеры dram, pcie и тому подобное приобретаются IP у какой-то третьей стороны с NDA, поэтому только некоторый процент деталей этого периферийного устройства находится в микросхеме TI, Broadcom или Allwinner и т. д.). Но хотя бы код инициализации с открытым исходным кодом и драйверы для Linux, что лучше, чем что-то разбирать. Вы можете выбрать черную кость бигля или малиновый пи (плохой пример драм сделан в графическом процессоре, хотя теперь он открыт, я думаю, в некоторой ненулевой степени) или бесчисленное количество плат на базе Allwinner.

На высоком уровне опыт и процесс такие же: загрузка, инициализация, загрузка операционной системы, запуск операционной системы. dram init, pcie init, usb init, ethernet происходят в нужное время для загрузки и запуска. Технологии одинаковые (ddr2, ddr3, ddr4, pcie gen 1,2,3, usb 1,2,3 и т. Д.), В некоторых случаях приобретенный IP такой же или похожий и т. Д.


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

Термины BIOS и CMOS были как бы перегружены, чтобы включать не только то, что было BIOS (который, вероятно, также включал загрузчик, исходный исходный код доступен / был доступен в оригинальных руководствах для ПК Intel, которые у меня до сих пор лежат где-то от моего оригинала. pc (которого у меня, к сожалению, больше нет)). Сегодня операционная система полагается на bios или efi, чтобы получить этот общий подход, мне не нужно знать, но затем, когда ОС работает, она загружает драйверы для конкретного контроллера и больше не нуждается в системных вызовах BIOS. Это очень похожая на ПК вещь, основанная на истории ПК, а не ПК - это более традиционный подход.

Итак, да, BIOS - это какой-то код, который обрабатывал программные прерывания (системные вызовы), но мы также неправильно или правильно применяем термин для включения загрузчика. Когда вы покупаете BIOS у AMI и т. Д., Он загружает чип.

person old_timer    schedule 29.07.2020
comment
Также обратите внимание, что на серверах часто есть BMC, компьютер для управления платой (и вы также покупаете это программное обеспечение в AMI), процессор на базе руки, который вы можете использовать через IPMI или другой для проверки работоспособности и состояния материнской платы, выключения / отключения питания. иногда перезагружать ОС, загружаться из сети и т. д. Также мы теперь знаем и, естественно, ожидали, что есть другие процессоры, например, чип Intel x86, который помогает управлять чипом. У каждого из этих процессоров есть микропрограмма и способ загрузки этой микропрограммы, который частично зависит от них (частично зависит от системы). - person old_timer; 29.07.2020
comment
общий дизайн системы включает в себя эти компоненты, и загрузка самого x86, а дальше по дороге, ведущей к dram и pcie init, являются частью этого союза этих различных компонентов в дизайн системы: кто загружается первым, кто загружает и т. д. - person old_timer; 29.07.2020
comment
Обратите внимание: если у вас не хватает памяти, то есть припаяна не на съемной карте памяти, тогда вам не обязательно иметь SPD, это то, как вы решите сделать дизайн, например, ваш мобильный телефон с DDR3L или DDR4L. И вам не обязательно использовать JEDEC SPD, который использует математические вычисления во время выполнения, вы можете решить это по-своему в проекте системы, основываясь на частях и альтернативах, выбранных для сборки. Или вы можете добавить стоимость eeprom и использовать SPD. - person old_timer; 29.07.2020