LINUX.ORG.RU

Как происходит загрузка на ARM?

 ,


2

2

Сабж. На x86 процесс в общем-то понятен, тут есть BIOS, UEFI, MBR и прочее.

А как происходит загрузка ОС на ARM-ках? Я знаю, что у малинок к примеру что-то свое (бинарное) + загрузчик собственно ОСи. А на других платформах как?

ЗЫ вдогонку: где ваще почитать про ARM?

Ответ на: комментарий от intelfx

640x480x8 — это уже 300 КиБ, половина conventional памяти.

:) Если бы так было, то на PC игрушки бы не появились. Для адресации в режиме 640x480 хватало и 38 КиБ, просто использовались слои.

Какое там было разрешение и куда отображался фреймбуфер?

Понятия «фрейбуфер» не было, а память видеоадаптера, например, в режиме 640x480 мапилась на 0xA000:0x0000.

BRE ★★
()
Ответ на: комментарий от BRE

:) Если бы так было, то на PC игрушки бы не появились. Для адресации в режиме 640x480 хватало и 38 КиБ, просто использовались слои.

Поясни. 640x480x8(bits-per-pixel)/8(bits-per-byte) = 307200 B = 300 KiB.

Понятия «фрейбуфер» не было, а память видеоадаптера, например, в режиме 640x480 мапилась на 0xA000:0x0000.

Фреймбуфер в моём понимании — это любая область памяти, которая содержит кадр целиком, попиксельно. Если он был в памяти видеоадаптера — отлично. Если она была замаплена в верхнюю память (начиная с 0xA000) — ещё лучше, я об этом и спрашивал. Только что значит :0x0000?

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Поясни. 640x480x8(bits-per-pixel)/8(bits-per-byte) = 307200 B = 300 KiB.

Каждая точка - 1 пиксель, в байте - 8 точек, а вот чтобы задать цвет нужны 4 бита - соответственно 4 слоя. Все слои мапились по одному адресу, но была возможность маскировать в какой слой писать, а в какой нет. Поищи в интернете организацию памяти в EGA, были картинки это поясняющие.

По поводу адресов, так адресовали в реальном режиме на 16-битных процессорах. Размер сегмента не превышал 64 КиБ, поэтому первым шел сегментный адрес, а вторым смещение в сегменте. Физический адрес для 0xA000:0x0000 - 0xA00000.

BRE ★★
()
Ответ на: комментарий от BRE

Каждая точка - 1 пиксель, в байте - 8 точек, а вот чтобы задать цвет нужны 4 бита - соответственно 4 слоя. Все слои мапились по одному адресу, но была возможность маскировать в какой слой писать, а в какой нет. Поищи в интернете организацию памяти в EGA, были картинки это поясняющие.

Ммм, bueno. Ещё и 16 цветов всего в палитре. Окей, вопрос снимается.

Но мы вроде про VGA говорили исходно. Там тоже было так? Или всё-таки был настоящий фреймбуфер?

По поводу адресов, так адресовали в реальном режиме на 16-битных процессорах. Размер сегмента не превышал 64 КиБ, поэтому первым шел сегментный адрес, а вторым смещение в сегменте. Физический адрес для 0xA000:0x0000 - 0xA00000.

А, это был не диапазон, а сегмент:смещение. Я количество нулей неправильно прочёл, думал, ты имел в виду два физических адреса.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от splinter

Кури u-boot spl direct kernel load. ЕМНИП можно прямо с ext раздела загрузить ядро и отправить на выполнение.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от intelfx

Но мы вроде про VGA говорили исходно. Там тоже было так?

Да. По ровно той же причине — в 1мб уже не оставалось размеченных участков, поэтому для доступа к видеопамяти было только 64K, что для такого способа хватало. В SVGA пришлось делать уже более накладный способ с переключением страниц видеопамяти в это окно (это стало рождением видеодрайверов). Прямой доступ к фреймбуферу появился только в 1994 и только в защищённом режиме.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

Прямой доступ к фреймбуферу появился только в 1994 и только в защищённом режиме.

ну тащемта область графической памяти cga/ega - таки тоже можно считать фреймбуфером (т.к. там рисуется кадр целиком).

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

ну тащемта область графической памяти cga/ega - таки тоже можно считать фреймбуфером

Ни у того ни у другого нельзя :) У EGA видеопамять 640*350*4bpp/8bit=112000, а окошко всего 64к, поэтому там и используются слои. У CGA же нет своей видеопамяти и картинку он рисует прямо из оперативной памяти, отчего там довольно геморно было графику ручками писать — чтобы не было снега, с CGAшным RAMDAC надо было вручную по тактам синхронизироваться, ладно хоть 808[68] одну частоту имели.

redgremlin ★★★★★
()
Ответ на: комментарий от i-rinat

Эталон выборочного цитирования.

Нижний диапазон адресов PCI — это немного более конкретное указание, чем «нижние 4G».

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Нижний диапазон адресов PCI — это немного более конкретное указание, чем «нижние 4G».

Было бы неплохо, если бы ты ещё объяснил, почему это всё важно. И как это относится к реальному режиму.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

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

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от intelfx

Ты ж поднял вопрос о том, куда мапился фреймбуфер. Видимо, это какое-то значение имело?

Я смутно помню, что фреймбуфер в vesa 2.0 я так и не пробовал. Видимо, испугался защищенного режима, для которого непонятно было, как писать. Теперь вот интересно, а какой адрес там функции vesa возвращали, указывал ли он в адреса PCI. Конкретные адреса не гуглятся, а пробовать слишком лень.

i-rinat ★★★★★
()

Могу сказать за Raspberry Pi, если еще не было:
1. Создаешь в начале флешки раздел FAT16 емнип.
2. Кидеаешь туда файлы bootcode.bin, и start.elf (первый вроде бы содержит в себе что-то типа части биоса, а второй — загрузчик ОС). Оба файла стандартные и предоставляются производителем.
3. Закидываешь свое ядро и обзываешь его kernel.img (это должен быть object-файл).

Все кроме kernel.img грузиться на GPU.

PS: я мог все перепутать:)

sphericalhorse ★★★★★
()
Ответ на: комментарий от hobbit

Раньше под х86 подобное тоже было, например, какие-нибудь виабушные NEC PC, где как бы тот же интел, но обычный DOS или шиндошс95 на них не поставить, надо специальные версии

TheAnonymous ★★★★★
()
Ответ на: комментарий от AS

Karateka, F-19, F-117 - это всё шло на Искре 1030.

И арканоид!

А на 286 с тем же мегабайтом шёл вполне себе графический и многоуровневый Eye of Beholder. Помню, как там червяк из-за угла вылез, я чуть не блеванул с испуга...

hobbit ★★★★★
()
Ответ на: комментарий от sphericalhorse

Могу сказать за Raspberry Pi

Вау, вот это интересно!

Кидеаешь туда файлы bootcode.bin, и start.elf (первый вроде бы содержит в себе что-то типа части биоса, а второй — загрузчик ОС). Оба файла стандартные и предоставляются производителем.

А исходники на это добро есть? Ну или хотя бы толковая документация на «часть биоса», если вдруг кто-нибудь :) захочет это из своей нестандартной ОС вызвать.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Ну это Распберри. Думаю в документации на сайте есть и исходники и детальная дока.
Вообще в интернете куча статей на эту тему. Гуглиться по «Raspberry PI bare metal» или типа того.. Там будет инфа как писать код под чистое желео, и включительно с подробными пояснениями, как этот код будет грузиться.

sphericalhorse ★★★★★
()
Последнее исправление: sphericalhorse (всего исправлений: 1)

Тут есть и про TrustZone и про Secure Boot и про UEFI и про U-Boot на примере NXP QorIQ LS1046A:

https://www.nxp.com/docs/en/supporting-information/QORIQ_LS1046A_BSP_V0-4_REV...

+ почитай еще Referenfce Manual на него

Исходники:

TrustZone: https://github.com/qoriq-open-source/ppa-generic

UEFI: https://github.com/qoriq-open-source/uefi

U-Boot: https://github.com/qoriq-open-source/u-boot

wieker ★★
()
Последнее исправление: wieker (всего исправлений: 3)

Сам интересуюсь сабжем так как с недавнего времени являюсь обладателем одноплатника Orange Pi PC. Насколько я понял, копаясь в теме, ARM отличается от IBM PC тем, что последний является конструктором, а устройства на базе ARM - не расширяемые в принципе, всё просто напаяно на одной плате, следовательно при загрузке процедура BIOS POST, во время которой происходит определение подключённых к шине устройств, не нужна, да и самого BIOSа в привычном понимании нет. При загрузке с флешки грузится SPL, который является загрузчиком загрузчика, потом грузится u-boot - это собственно сам загрузчик операционной системы, причём он должен быть собран конкретно под данное устройство, при этом в память также загружается dtb (Device Tree Binary) уникальный для каждого устройства, без которого работа невозможно. После идёт загрузка ядра Linux.

Isur
()
Ответ на: комментарий от sphericalhorse

Могу сказать за Raspberry Pi, если еще не было: 1. Создаешь в начале флешки раздел FAT16 емнип. 2. Кидеаешь туда файлы bootcode.bin, и start.elf (первый вроде бы содержит в себе что-то типа части биоса, а второй — загрузчик ОС). Оба файла стандартные и предоставляются производителем. 3. Закидываешь свое ядро и обзываешь его kernel.img (это должен быть object-файл).

Все кроме kernel.img грузиться на GPU.

PS: я мог все перепутать:)

На счёт ядра точно путаешь (или на малинке и апельсинке) имя образа отличается.
Ядро должно называться uImage Ещё есть script.bin, это типа конфигурационный скрипт для u-boot, только не вкурил как он работает.
Начало связки SPL+u-boot+dtb должно находится в 8 секторе флешки (где-то между MBR и FAT32-разделом), его туда при помощи dd закидывают.

Isur
()
Ответ на: комментарий от Isur

Я просто когда-то давно это все руками делал на каком-то воркшопе. Ни u-boot'ом, ни файлом uimage там и не пахло.

sphericalhorse ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.