Как запустить программу без операционной системы часть 1

Как вы запускаете программу самостоятельно без операционной системы? Можете ли вы создать сборочные программы, которые компьютер может загружать и запускать при запуске, например, загрузить компьютер с флэш-накопителя и запустить программу, которая находится на cpu?

автор: Ezio

2 ответов

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

вы помещаете свой двоичный код в место, где процессор ищет после перезагрузки (например, адрес 0 на ARM).

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

общий ответ на вопрос: это может быть сделанный. Это часто предлагается как «программирование голого металла». Чтобы читать с флеш-накопителя, вы хотите знать, что такое USB, и вы хотите иметь драйвер для работы с этим USB. Программа на этом диске также должна быть в определенном формате. В какой-то конкретной файловой системе. Это то, что обычно делают загрузчики.

Делаем }{АКЕРФОН из Android | 1 часть | TWRP/Прошивка/ADB | UnderMind

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

здесь вы можете найти большой учебник как сделать основную операционную систему на Raspberry PI.

изменить: Эта статья и вся wiki.osdev.org will anwer большинство ваших вопросов http://wiki.osdev.org/Introduction

кроме того, если вы не хотите экспериментировать непосредственно на оборудовании, вы можете запустить его как виртуальную машину с помощью гипервизоров, таких как qemu. См. как запустить «hello world» непосредственно на виртуализированном оборудовании ARM здесь.

автор: Kissiel

Runnable примеры

технически, программа, которая работает без ОС, является ОС. Итак, давайте посмотрим, как создать и запустить некоторые крошечные hello world OSes.

код всех приведенных ниже примерах присутствует это GitHub РЕПО. Все было протестировано на Ubuntu 14.04 AMD64 QEMU и реальном оборудовании ThinkPad T430.

загрузочный сектор

на x86 самая простая и низкая вещь, которую вы можете сделать, это создать главный загрузочный сектор (MBR), тип загрузочный сектор, а затем установите его на диск.

здесь мы создаем один printf звоните:

printf ‘4%509s52’ > main.img sudo apt-get install qemu-system-x86 qemu-system-x86_64 -hda main.img

main.img содержит следующее:

    4 в восьмеричной == 0xf4 в hex: кодировка для hlt инструкция, которая говорит CPU прекратить работу. поэтому наша программа ничего не будет делать: только начать и остановка. мы используем восьмеричный потому что x шестнадцатеричные номера не указаны POSIX. мы могли бы легко получить эту кодировку с:

echo hlt > a.asm nasm -f bin a.asm hd a

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

Быстрая загрузка системы

работы на реальном оборудовании

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

    сжечь изображение на USB-накопитель (уничтожит ваши данные!):

sudo dd if=main.img of=/dev/sdX

Привет, мир

теперь, когда мы сделали минимальную программу, давайте перейдем к hello world.

очевидный вопрос: как сделать IO? Несколько вариантов:

  • попросите прошивку, например BIOS или UEFI, сделать, если для нас
  • VGA: специальная область памяти, которая печатается на экран при записи. Может использоваться в защищенном режиме.
  • напишите драйвер и поговорите непосредственно с оборудованием дисплея. Это «правильный» способ сделать это: более мощный, но более сложные.
  • используйте функции отладки чипов. ARM называет их semihosting например. На реальном оборудовании это требует дополнительной аппаратной и программной поддержки, но на эмуляторах это может быть бесплатный удобный вариант. пример.

здесь мы сделайте пример BIOS, как это проще. Но заметьте, что это не самый надежный метод.

вот газовый код:

.code16 .global _start _start: cli mov $msg, %si mov x0e, %ah loop: lodsb or %al, %al jz halt int x10 jmp loop halt: hlt msg: .asciz «hello world» .org 510 .word 0xaa55

кроме стандартных инструкций по сборке userland, у нас есть:

  • .code16 : говорит газу вывести наружу 16-разрядный код
  • cli : отключить прерывания программного обеспечения. Они могут заставить процессор начать работать снова после hlt
  • int x10 : делает a Вызов BIOS. Это то, что печатает символы один за другим.
  • .org 510 и .word 0xaa55 : места волшебные байты в конце

быстрый и грязный способ скомпилировать это с:

as -o main.o main.S ld —oformat binary -o main.ing -Ttext 0x7C00 main.o

и работать main.img как и раньше.

здесь есть два важных флага:

  • —oformat binary : выведите исходный двоичный код сборки, не деформируйте его внутри файла ELF, как в случае обычного userland выполнимые программы.
  • -Ttext 0x7C00 : мы должны сказать компоновщику ld где будет размещен код, чтобы он мог получить доступ к памяти. в частности, это используется на этапе перемещения. Подробнее об этом здесь.

лучший способ компиляции-использовать чистый скрипт компоновщика как это. Сценарий компоновщика также может размещать магические байты для США.

прошивка

по правде говоря, ваш загрузочный сектор не первое программное обеспечение, которое работает на процессоре системы.

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

  • сделано производителями оборудования
  • обычно закрытый источник, но, вероятно, c-based
  • хранится в памяти только для чтения, и поэтому сложнее / невозможно изменить без согласие продавца.

хорошо известные прошивки включают в себя:

  • BIOS: старая прошивка x86. SeaBIOS-это реализация с открытым исходным кодом по умолчанию, используемая QEMU.
  • UEFI: преемник BIOS, лучше стандартизированный, но более способный и невероятно раздутый.
  • Coreboot: благородный крест арка с открытым исходным кодом попытка

прошивка делает вещи например:

  • петля над каждым жестким диском, УСБ, сетью, ЕТК. пока не найдешь что-нибудь загрузочное. когда мы запускаем QEMU, -hda говорит, что main.img — это жесткий диск, подключенный к оборудованию, и hda является первым, который будет опробован, и он используется.
  • загрузите первые 512 байт в адрес оперативной памяти 0x7c00 , поместите туда RIP процессора, и пусть он работает
  • показать все например, меню загрузки или вызовы печати BIOS на дисплее

прошивка предлагает OS-подобные функции, от которых зависит большинство OS-es. Например. подмножество Python было портировано для работы в BIOS / UEFI:https://www.youtube.com/watch?v=bYQ_lq5dcvM

Читайте также:
Детские программы про животных для самых маленьких

можно утверждать, что прошивки неотличимы от ос, и что прошивка является единственным «истинным» голым металлическим программированием, которое можно сделать.

сложно

при включении ПК чипы, составляющие чипсет (northbridge, southbridge и SuperIO), еще не инициализированы должным образом. Несмотря на то, что BIOS ROM настолько удален от ЦП, насколько это возможно, это доступно ЦП, потому что это должно быть, иначе у ЦП не было бы инструкций для выполнения. Это не означает, что BIOS ROM полностью сопоставлен, как правило, нет.

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

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

начальное состояние Post BIOS

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

поэтому сделайте себе одолжение и используйте некоторый код инициализации, например:https://stackoverflow.com/a/32509555/895245

регистры как %ds и %es имеют важные побочные эффекты, поэтому вы должны обнулить их, даже если вы не используете их явно.

обратите внимание, что некоторые эмуляторы лучше, чем реальные оборудование и дать вам хорошее начальное состояние. Затем, когда вы идете работать на реальном оборудовании, все ломается.

GRUB Multiboot

загрузочные сектора просты, но они не очень удобны:

  • вы можете иметь только одну ОС на диск
  • код загрузки должен быть очень маленьким и вписываться в 512 байт. Это можно решить с помощью int 0x13 BIOS вызов.
  • вам нужно сделать много запуска себя, как переход в защищенный режим

именно по этим причинам GRUB создал более удобный формат файла под названием multiboot.

если вы подготовите свою ОС как многозадачный файл, GRUB сможет найти его внутри обычной файловой системы.

это что делают большинство дистрибутивов, помещая изображения ОС под /boot .

Multiboot файлы в основном файл ELF со специальным заголовком. Они указываются GRUB по адресу:https://www.gnu.org/software/grub/manual/multiboot/multiboot.html

вы можете превратить мультизагрузочный файл в загрузочный диск с помощью grub-mkrescue .

Эль Torito С

также возможно произвести гибридное изображение которое работает на или ИСО или УСБ. Это можно сделать с помощью grub-mkrescue (пример), а также выполняется ядром Linux на make isoimage используя isohybrid .

руку

ARM-land имеет свои собственные соглашения (или больше отсутствия соглашений, так как ARM лицензирует IP поставщикам, которые его изменяют), но общие идеи те же:

  • вы пишете код на магический адрес в памяти
  • вы делаете IO с магическими адресами

некоторые различия включают в себя:

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

вот несколько примеров:

  • как сделать голые металлические программы ARM и запустить их на QEMU? QEMU дружественный UART interation
  • как запустить программу C без ОС на Raspberry Pi? Сид оборудования Пи малины дружелюбное взаимодействие

ресурсы

  • http://wiki.osdev.org это большой источник для этих вопросов.
  • https://electronics.stackexchange.com/questions/223929/c-standard-libraries-on-bare-metal/223931 для того, чтобы построить более интересное программное обеспечение «bare metal software», удобно иметь возможность использовать его стандартную библиотеку. Одна возможность — использовать https://en.wikipedia.org/wiki/Newlib, как указано в этой теме. Такие голые металлические реализации C-library могут, например, перенаправить stdout на UART. Я думаю, что вы должны реализовать заглушки syscalls сами для QEMU, однако: https://balau82.wordpress.com/2010/12/16/using-newlib-in-arm-bare-metal-programs/
  • https://github.com/scanlime/metalkit более автоматизированный / общий голый металл система компиляции, которая предоставляет крошечный пользовательский API
  • https://github.com/dwelch67/raspberrypi выглядит как источник высшего качества для Raspberry Pi (ARM)

Источник: askdev.ru

Как запустить программу без операционной системы?

Как запустить программу самостоятельно без запуска операционной системы? Можете ли вы создать программы сборки, которые компьютер может загружать и запускать при запуске, например, загружать компьютер с флеш-накопителя и запускать программу, которая находится на процессоре?

спросил(а) 2014-02-27T01:13:00+04:00 9 лет, 3 месяца назад
добавить комментарий
пожаловаться

Как вы запускаете программу самостоятельно, без запуска операционной системы?

Вы помещаете свой двоичный код в место, где процессор ищет после перезагрузки (например, адрес 0 на ARM).

Можете ли вы создать программы сборки, которые компьютер может загружать и запускать при запуске (например, загружать компьютер с флеш-накопителя и запускать программу, находящуюся на диске)?

Общий ответ на вопрос: это можно сделать.
Он часто упоминается как «голое программирование».
Чтобы читать с флеш-накопителя, вы хотите знать, что такое USB, и вы хотите, чтобы какой-нибудь драйвер работал с этим USB. Программа на этом диске также должна быть в определенном формате. В какой-то конкретной файловой системе. Это то, что обычно выполняют загрузчики.
Многие платы ARM позволяют делать некоторые из этих вещей. У некоторых есть загрузчик, который поможет вам с базовой настройкой. Здесь вы можете найти отличный учебник о том, как сделать базовую операционную систему на малиновой PI.
Изменить:
Эта статья, и весь wiki.osdev.org отведут большинство ваших вопросов
http://wiki.osdev.org/Introduction
Кроме того, если вы не хотите экспериментировать непосредственно с оборудованием, вы можете запустить его как виртуальную машину с помощью гипервизоров типа qemu. Посмотрите, как запустить «hello world» непосредственно на виртуализированное оборудование ARM здесь.

ответил(а) 2014-02-27T01:23:00+04:00 9 лет, 3 месяца назад
добавить комментарий
пожаловаться

    ноутбук Lenovo Thinkpad T430 x86 с прошивкой UEFI BIOS 1.16 Raspberry Pi 3 на основе ARM

sudo dd if=main.img of=/dev/sdX

подключите USB к компьютеру включи скажи ему загрузиться с USB. Это означает, что прошивка выбирает USB перед жестким диском. Если это не стандартное поведение вашей машины, продолжайте нажимать Enter, F12, ESC или другие подобные странные клавиши после включения питания, пока не появится меню загрузки, где вы можете выбрать загрузку с USB.

Часто можно настроить порядок поиска в этих меню. Например, на моем T430 я вижу следующее. После включения, это когда мне нужно нажать Enter, чтобы войти в меню загрузки: enter image description here Затем здесь я должен нажать F12, чтобы выбрать USB в качестве загрузочного устройства: enter image description here Оттуда я могу выбрать USB в качестве загрузочного устройства следующим образом: enter image description here В качестве альтернативы, чтобы изменить порядок загрузки и выбрать USB-интерфейс с более высоким приоритетом, я бы нажал F1 на экране «Startup Interrupt Menu», а затем перешел к: enter image description here Загрузочный сектор На x86 самое простое и низкоуровневое средство, которое вы можете сделать, — это создать главный загрузочный сектор (MBR), который является типом загрузочного сектора, и затем установить его на диск. Здесь мы создаем один с одним вызовом printf :

Читайте также:
Программы похожие на матлаб

printf ‘364%509s125252’ > main.img
sudo apt-get install qemu-system-x86
qemu-system-x86_64 -hda main.img

Результат: enter image description here Обратите внимание, что даже не делая ничего, несколько символов уже напечатаны на экране. Они печатаются прошивкой и служат для идентификации системы. А на T430 у нас просто пустой экран с мигающим курсором: enter image description here main.img содержит следующее:

    364 в восьмеричном == 0xf4 в шестнадцатеричном виде: кодировка для инструкции hlt , которая сообщает ЦП прекратить работу. Поэтому наша программа не будет ничего делать: только запускать и останавливать. Мы используем восьмеричный, потому что x числа шестигранных не определены POSIX. Мы могли бы легко получить эту кодировку с помощью:

echo hlt > a.S
as -o a.o a.S
objdump -S a.o
какие выводы:
a.o: file format elf64-x86-64

Disassembly of section .text:

0000000000000000 :
0: f4 hlt
hd main.img
который показывает ожидаемое:
00000000 f4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |. |
00000010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
*
000001f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 aa | U.|
00000200

enter image description here

где 20 — это пробел в ASCII. Микропрограмма BIOS считывает эти 512 байт с диска, помещает их в память и устанавливает для ПК первый байт, чтобы начать их выполнение. Привет мир загрузочный сектор Теперь, когда мы создали минимальную программу, давайте перейдем к привету. Очевидный вопрос: как сделать IO?

Несколько вариантов:

    попросите прошивку, например, BIOS или UEFI, чтобы сделать, если для нас VGA: специальная область памяти, которая выводится на экран при записи в. Может использоваться в защищенном режиме. написать драйвер и поговорить напрямую с оборудованием дисплея. Это «правильный» способ сделать это: более мощный, но более сложный. последовательный порт.

Это очень простой стандартизированный протокол, который отправляет и получает символы с хост-терминала. На десктопах это выглядит так: Источник К сожалению, он не представлен на большинстве современных ноутбуков, но является наиболее распространенным способом разработки плат разработки, см. Примеры ARM ниже.

Это действительно позор, так как такие интерфейсы действительно полезны для отладки ядра Linux, например. использовать функции отладки чипов. ARM называет их полухостингом, например. На реальном оборудовании это требует дополнительной аппаратной и программной поддержки, но на эмуляторах это может быть бесплатный удобный вариант. Пример.

Здесь мы сделаем пример BIOS, так как он проще на x86. Но обратите внимание, что это не самый надежный метод. main.S

.code16
mov $msg, %si
mov $0x0e, %ah
loop:
lodsb
or %al, %al
jz halt
int $0x10
jmp loop
halt:
hlt
msg:
.asciz «hello world»
SECTIONS
/* The BIOS loads the code from the disk to this location.
* We must tell that to the linker so that it can properly
* calculate the addresses of symbols we might jump to.
*/
. = 0x7c00;
.text :
__start = .;
*(.text)
/* Place the magic boot bytes at the end of the first 512 sector. */
. = 0x1FE;
SHORT(0xAA55)
>
>
Собрать и связать с:
as -g -o main.o main.S
ld —oformat binary -o main.img -T link.ld main.o
qemu-system-x86_64 -hda main.img

Результат: enter image description here И на Т430: enter image description here Проверено на: Lenovo Thinkpad T430, UEFI BIOS 1.16. Диск создан на хосте Ubuntu 18.04. Помимо стандартных инструкций по сборке пользовательского пространства, у нас есть:

    .code16 : говорит .code16 выводить 16-битный код cli : отключить программные прерывания. Это может сделать запуск процессора работает снова после hlt int $0x10 : вызывает ли BIOS. Это то, что печатает символы один за другим.

Важные флаги ссылок:

    —oformat binary : выводит необработанный двоичный код сборки, не деформируйте его внутри файла ELF, как в случае с обычными исполняемыми файлами пользовательского пространства.

Чтобы лучше понять часть сценария компоновщика, ознакомьтесь с этапом перемещения ссылок: что делают компоновщики?Кулер x86 голые метал программы Вот несколько более сложных установок из чистого металла, которые я достиг:

    multicore: Как выглядит многоядерный язык ассемблера? paging: как работает x86 paging?

Используйте C вместо сборки Резюме: используйте GRUB multiboot, который решит множество досадных проблем, о которых вы никогда не задумывались. Смотрите раздел ниже.
Основная сложность на x86 состоит в том, что BIOS загружает только 512 байт с диска в память, и вы, вероятно, взорвете эти 512 байт при использовании C! Чтобы решить эту проблему, мы можем использовать двухэтапный загрузчик. Это делает дальнейшие вызовы BIOS, которые загружают больше байтов с диска в память, вот минимальный пример этапа 2 с нуля с использованием вызова int 0x13 BIOS В качестве альтернативы:

    если он нужен только для работы в QEMU, а не на реальном оборудовании, используйте -kernel , которая загружает весь файл ELF в память. Вот пример ARM, который я создал с помощью этого метода. для Raspberry Pi прошивка по умолчанию заботится о загрузке образа для нас из файла ELF с именем kernel7.img , так же, как -kernel делает QEMU -kernel .

Только для образовательных целей, вот один минимальный пример C: main.c

void main(void) int i;
char s[] = ;
for (i = 0; i < sizeof(s); ++i) __asm__ (
«int $0x10» : : «a» ((0x0e );
>
while (1) __asm__ («hlt»);
>;
>
.code16
.text
.global mystart
mystart:
ljmp $0, $.setcs
.setcs:
xor %ax, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %ss
mov $__stack_top, %esp
cld
call main
ENTRY(mystart)
SECTIONS
. = 0x7c00;
.text : entry.o(.text)
*(.text)
*(.data)
*(.rodata)
__bss_start = .;
/* COMMON vs BSS: https://stackoverflow.com/questions/16835716/bss-vs-common-what-goes-where */
*(.bss)
*(COMMON)
__bss_end = .;
>
/* https://stackoverflow.com/questions/53584666/why-does-gnu-ld-include-a-section-that-does-not-appear-in-the-linker-script */
.sig : AT(ADDR(.text) + 512 — 2)
SHORT(0xaa55);
>
/DISCARD/ : *(.eh_frame)
>
__stack_bottom = .;
. = . + 0x1000;
__stack_top = .;
>
set -eux
as -ggdb3 —32 -o entry.o entry.S
gcc -c -ggdb3 -m16 -ffreestanding -fno-PIE -nostartfiles -nostdlib -o main.o -std=c99 main.c
ld -m elf_i386 -o main.elf -T linker.ld entry.o main.o
objcopy -O binary main.elf main.img
qemu-system-x86_64 -drive file=main.img,format=raw

    Напиши свое. Это всего лишь куча заголовков и файлов C в конце концов, верно? Правильно?? Newlib Подробный пример по адресу: https://electronics.stackexchange.com/questions/223929/c-standard-libraries-on-bare-metal/223931 Newlib реализует все скучные, не связанные с ОС вещи для вас, например, memcmp , memcpy и т.д. Затем он предоставляет некоторые заглушки для реализации системных вызовов, которые вам нужны сами. Например, мы можем реализовать exit() в ARM с помощью полухостинга:
Читайте также:
Способы обмена данными между программами

void _exit(int status) __asm__ __volatile__ («mov r0, #0x18; ldr r1, =#0x20026; svc 0x00123456»);
>

как показано в этом примере. Например, вы можете перенаправить printf в системы UART или ARM или реализовать exit() с использованием полухостинга. встроенные операционные системы, такие как FreeRTOS и Zephyr. Такие операционные системы обычно позволяют отключить упреждающее планирование, что дает вам полный контроль над временем выполнения программы. Их можно рассматривать как своего рода предварительно реализованный Newlib.
GNU GRUB Multiboot Загрузочные сектора просты, но не очень удобны:

    Вы можете иметь только одну ОС на диск код загрузки должен быть очень маленьким и вмещаться в 512 байт Вы должны сделать много запуска самостоятельно, например перейти в защищенный режим

Именно по этим причинам GNU GRUB создал более удобный формат файлов, называемый multiboot. Минимальный рабочий пример: https://github.com/cirosantilli/x86-bare-metal-examples/tree/d217b180be4220a0b4a453f31275d38e697a99e0/multiboot/hello-world Я также использую его в своем репозитории GitHub examples, чтобы иметь возможность легко запускать все примеры на реальном оборудовании, не перегружая USB миллион раз.

Результат QEMU: enter image description here T430: enter image description here Если вы подготовите свою ОС как мультизагрузочный файл, GRUB сможет найти его в обычной файловой системе. Это то, что делает большинство дистрибутивов, помещая образы ОС в /boot . Мультизагрузочные файлы — это в основном файл ELF со специальным заголовком. Они указаны GRUB по адресу: https://www.gnu.org/software/grub/manual/multiboot/multiboot.html. Вы можете превратить мультизагрузочный файл в загрузочный диск с помощью grub-mkrescue . Прошивка По правде говоря, ваш загрузочный сектор не является первым программным обеспечением, которое работает на системном процессоре. На самом деле сначала запускается так называемая прошивка, то есть программное обеспечение:

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

Хорошо известные прошивки включают в себя:

    BIOS: старая прошивка для x86. SeaBIOS является реализацией с открытым исходным кодом по умолчанию, используемой QEMU. UEFI: преемник BIOS, лучше стандартизированный, но более способный и невероятно раздутый. Coreboot: благородная перекрестная арка с открытым исходным кодом

Прошивка делает такие вещи, как:

    Зацикливайтесь на каждом жестком диске, USB, сети и т.д., пока не найдете что-нибудь загрузочное. Когда мы запускаем QEMU, -hda говорит, что main.img — это жесткий диск, подключенный к оборудованию, и hda — первый, который будет опробован, и он используется. загрузите первые 512 байт в адрес памяти ОЗУ 0x7c00 , поместите туда процессор RIP и дайте ему поработать показывать на дисплее такие вещи, как меню загрузки или вызовы печати BIOS

Прошивка предлагает функциональность, подобную ОС, от которой зависит большинство ОС. Например, подмножество Python было портировано для работы в BIOS/UEFI: https://www.youtube.com/watch?v=bYQ_lq5dcvM Можно утверждать, что прошивки неотличимы от ОС, и что прошивка — это единственное «истинное» программирование на голом железе, которое можно сделать. Как говорит этот разработчик CoreOS:

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

Это не означает, что ПЗУ BIOS полностью сопоставлено, обычно нет. Но достаточно для отображения процесса загрузки. Любые другие устройства, просто забудьте об этом. Когда вы запускаете Coreboot в QEMU, вы можете экспериментировать с более высокими уровнями Coreboot и с полезными нагрузками, но QEMU предлагает мало возможностей для экспериментов с низкоуровневым кодом запуска. Во-первых, оперативная память работает с самого начала.

    сериал, который широко доступен на девбордах мигать светодиодом

enter a character
got: a
new alloc of 1 bytes at address 0x0x4000a1c0
enter a character
got: b
new alloc of 2 bytes at address 0x0x4000a1c0
enter a character

enter image description here

Смотрите также: Как создавать голые металлические ARM-программы и запускать их в QEMU? полностью автоматизированная установка блинкера Raspberry Pi по адресу: https://github.com/cirosantilli/raspberry-pi-bare-metal-blinker Смотрите также: Как запустить программу на C без ОС на Raspberry Pi? Чтобы «увидеть» светодиоды на QEMU, вы должны скомпилировать QEMU из источника с флагом отладки: https://raspberrypi.stackexchange.com/questions/56373/is-it-possible-to-get-the-state-of- что светодиоды-и-GPIOs-в-QEMU эмуляции, как-т Затем вы должны попробовать привет мир UART. Вы можете начать с примера блинкера и заменить ядро следующим: https://github.com/dwelch67/raspberrypi/tree/bce377230c2cdd8ff1e40919fdedbc2533ef5a00/uart01 Затем вы подключаете Pi к компьютеру с помощью адаптера UART to USB, как этот: и, наконец, подключиться к сериалу с хоста с помощью:

screen /dev/ttyUSB0 115200

enter image description here

Для Raspberry Pi мы используем карту Micro SD вместо флешки для хранения нашего исполняемого файла, для которого вам обычно требуется адаптер для подключения к вашему компьютеру: Не забудьте разблокировать адаптер SD, как показано по адресу: https://askubuntu.com/questions/213889/microsd-card-is-set-to-read-only-state-how-can-i-write-data -он-он /814585 # 814585https://github.com/dwelch67/raspberrypi выглядит как самый популярный учебник по голому металлу Raspberry Pi, доступный сегодня.

Некоторые отличия от x86:

    IO осуществляется путем записи магических адресов непосредственно, нет in и out инструкции. Это называется IO с отображением памяти. для некоторого реального оборудования, такого как Raspberry Pi, вы можете сами добавить прошивку (BIOS) в образ диска. Это хорошо, поскольку делает обновление прошивки более прозрачным.

Ресурсы

    http://wiki.osdev.org является отличным источником по этим вопросам. https://github.com/scanlime/metalkit — это более автоматизированная/общая система компиляции с открытым исходным кодом, которая предоставляет крошечный настраиваемый API

Источник: progi.pro

Как запустить программу без операционной системы. Часть 6: habr.ru/p/203706/. Поддержка работы с .

Поделитесь записью с друзьями

Хабрахабр 2 марта 2015

Как запустить программу без операционной системы.

Часть 6: habr.ru/p/203706/ . Поддержка работы с дисками с файловой системой FAT.

Как запустить программу без операционной системы. Часть 6: habr.ru/p/203706/. Поддержка работы с .

Подписаться Вы подписаны Отписаться

Подписаться Вы подписаны Отписаться

Источник: fotostrana.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru