2009-04-03 14 views
9

Jak skompilować C programu w celu poprawnego ELF formacie (lub w formacie RAW) tak, że może być wykonywane bezpośrednio z pamięci RAM bez OS? Załóżmy, że istnieje bootloader, który jest w stanie załadować kod do dowolnej lokalizacji w pamięci RAM i rozpocząć wykonywanie pod tym adresem. Aby być precyzyjnym, jakie powinny być flagi kompilatora (GCC)? Czy jest potrzebny plik mapy?Wykonanie bez OS

przykładowej aplikacji helloworld byłyby najbardziej mile widziane :)

Wystarczy opracować mój punkt widzenia,
niech główną metodą() będzie pusty nieskończonej pętli while w celu zapewnienia, że ​​nie OS szczególnych lub standardowych wywołań bibliotecznych są używane. Pożądane ustawienie o/p jest zawieszeniem. Z typowymi opcjami GCC program ładujący zdecydowanie nie załadowałby pliku wykonywalnego informując, że jest on nieprawidłowy w formacie ELF. Jednak przekazanie do linkera opcji -dN spowoduje jej ważność ELF. Więcej opcji kompilatora/linkera jest wymaganych, aby zawiesić się i nie zawiesić! Czym dokładnie są te opcje kompilatora?

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

Kompilacja
gcc -c -nostdinc -fno-wbudowane file.c
ld -dn -nostdlib file.o

BootLoader ładunki a.out do ubijania i uruchomienia.

Odpowiedz

6

Po pierwsze, istnieją ograniczenia co do tego, co można zrobić, po zakończeniu pracy bootloadera. Ograniczenia te wynikają z następujących czynników: (Zakładając, że twój program ładujący (np. Grub) przejdzie do trybu chronionego 32-bitowego) 1. Nie ma włączonego stronicowania. Musisz go włączyć. 2. Nie można wchodzić w interakcje z urządzeniami, ponieważ trzeba ustawić obsługę przerwania IRQ.

Oto klasyczny link do nauki programowania na gołym metalu (http://geezer.osdevbrasil.net/osd/index.htm). Istnieje również łącze do pobierania na stronie (http://geezer.osdevbrasil.net/osd/code/osd.tgz). Plik tar zawiera jądra demo o rosnącej złożoności. Możesz także zajrzeć do pliku make (linux.mak) i uzyskać wymagane flagi dla gcc.

Otworzyłem losowy plik make i okazało się, że użyto następujące flagi: gcc: -nostdinc -fno-wbudowane ld: -nostdlib
(wykonany jest jawne wywołanie do łącznika, stąd też musi LD flagę) .

Celem flag jest poinformowanie gcc, że nie ma konieczności łączenia z biblioteką standardową.

+0

Dzięki ... Linki były bardzo przydatne :) – AIB

0

Czy zdajesz sobie sprawę, że jeśli nie ładujesz systemu operacyjnego, musisz napisać sterownik urządzenia do pracy z dowolnym urządzeniem. Oznacza to brak pisania na ekranie bez zapisania sterownika dla tej konkretnej karty graficznej, bez czytania z dysku bez napisania sterownika dla tej konkretnej karty kontrolera dysku twardego, braku dostępu do klawiatury itp.

Zamiast tego możesz zajrzeć do czegoś o nazwie Kiosk Mode. Podstawową ideą jest to, że system operacyjny działa, ładuje wszystko, co potrzebne do aplikacji, ładuje aplikację, a następnie nie można przełączyć się do innej aplikacji.

+0

Zamiast pisać sterowniki urządzeń, możesz po prostu pozostać w trybie rzeczywistym i korzystać z przerwań systemu BIOS, aby uzyskać dostęp do wszystkich tych rzeczy. W przeciwnym razie wideo (VESA), klawiatura (emulacja PS/2) itp. Jest dość wystandaryzowana. – Andy

+0

Na początku próbowałem utworzyć Hang w systemie (zobacz kod w pytaniu). Aby uzyskać powiesić, nie potrzebujesz żadnych sterowników (z wyjątkiem może być sterownika pamięci, który, jak myślę, zapewni bootloader). Ale miałem awarię. Kiedy już skończę, mogę uzyskać kod sterownika i dalej eksplorować ... – AIB