Исполнение без ОС - PullRequest
       29

Исполнение без ОС

9 голосов
/ 03 апреля 2009

Как скомпилировать программу C в допустимый формат ELF (или формат RAW), чтобы ее можно было выполнить непосредственно из ОЗУ без какой-либо ОС ? Предположим, что существует загрузчик , который способен загружать код в любое место в ОЗУ и запускать выполнение по этому адресу. Если быть точным, какими должны быть флаги компилятора ( GCC )? Нужен ли файл карты?

Пример приложения helloworld приветствуется:)

Просто чтобы прояснить мою точку зрения,
пусть метод main () будет пустым бесконечным циклом while, чтобы гарантировать, что никакие OS специальные или стандартные вызовы библиотеки не используются. Желаемое о / п это зависание. При обычных параметрах GCC загрузчик определенно не сможет загрузить исполняемый файл, сообщив, что он является недопустимым форматом ELF . Однако, передав параметр компоновщика -dN , он станет действительным ELF . Требуются дополнительные параметры компилятора / компоновщика, чтобы он завис и не зависал !! Что это за опции компилятора?

file.c:
int main()
{
    while(1);
}

Компиляция
gcc -c -nostdinc -fno-встроенный файл.c
ld -dN -nostdlib file.o

Bootloader загружает a.out в ОЗУ и выполняет.

Ответы [ 4 ]

6 голосов
/ 03 апреля 2009

Во-первых, существуют ограничения на то, что вы можете сделать, когда загрузчик завершит свою работу. Эти ограничения обусловлены следующими причинами: (Предполагая, что ваш загрузчик (например, grub) переводит вас в 32-битный защищенный режим) 1. Нет подкачки. Вы должны включить это. 2. Там вы не можете взаимодействовать с устройствами, так как вам нужно установить обработчики для IRQ.

Вот классическая ссылка, которую я использовал, чтобы научиться искусству программирования на голом металле (http://geezer.osdevbrasil.net/osd/index.htm). Также на странице есть ссылка для скачивания (http://geezer.osdevbrasil.net/osd/code/osd.tgz). Файл tar содержит демонстрационные ядра с возрастающим уровнем сложности. Также вы можете заглянуть в файл make (linux.mak) и получить необходимые флаги для gcc.

Я открыл случайный файл make и обнаружил, что используются следующие флаги: gcc: -nostdinc -fno-builtin ld: -nostdlib
(Явный вызов компоновщика сделан, следовательно, ld также нужен флаг).

Цель флагов - сообщить gcc, что со стандартной библиотекой не должно быть никаких связей.

2 голосов
/ 05 апреля 2009

coreboot может загружать автономный ELF. см. «Инициализация DRAM»:

http://en.wikipedia.org/wiki/Coreboot

1 голос
/ 07 апреля 2009

http://www.osdever.net/bkerndev/index.php

Этот сайт шаг за шагом отвечает на ваш вопрос ...

0 голосов
/ 03 апреля 2009

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

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

...