Выполнение без ОС

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

Мы будем рады видеть образец приложения helloworld :)

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

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

Компиляция
gcc -c -nostdinc -fno-builtin file.c
ld -dN -nostdlib file.o

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


person AIB    schedule 03.04.2009    source источник


Ответы (4)


Во-первых, есть ограничения на то, что вы можете делать после того, как загрузчик завершит свою работу. Эти ограничения вызваны следующими причинами: (Предполагается, что ваш загрузчик (например, 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, что связывание со стандартной библиотекой выполняться не должно.

person user86735    schedule 03.04.2009
comment
Спасибо ... Ссылки очень пригодились :) - person AIB; 28.02.2011

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

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

person plan9assembler    schedule 05.04.2009

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

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

person suresh    schedule 07.04.2009

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

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

person Chas. Owens    schedule 03.04.2009
comment
Вместо того, чтобы писать драйверы устройств, вы можете просто оставаться в реальном режиме и использовать прерывания BIOS для доступа ко всем этим вещам. В остальном видео (VESA), клавиатура (эмуляция PS / 2) и т. Д. Довольно стандартизированы. - person Andy; 03.04.2009
comment
Для начала я пытался создать зависание в системе (см. Код в вопросе). Для того, чтобы вызвать зависание, вам не нужны никакие драйверы (кроме, возможно, драйвера памяти, который, я думаю, предоставит загрузчик). Но у меня случился сбой. Как только я закончу с этим, я могу получить код драйвера и продолжить изучение ... - person AIB; 01.02.2011