2012-12-30 24 views
9

Jaka jest różnica między dwoma pustymi programami main {} po kompilacji przy użyciu kompilatora c/C++ dla celu z systemem operacyjnym (np. Linux) i bez systemu operacyjnego (powiedzmy, dla docelowego obiektu DSP)? Jestem szczególnie zainteresowany, aby wiedzieć, co robi kompilator w inny sposób, gdy jest system operacyjny i poza nim. W jaki sposób środowisko wykonawcze kompilatora/języka różni się w dwóch przypadkach?Jaka jest różnica między dwoma pustymi programami głównymi {} z systemem i bez niego?

+4

od kiedy DSP nie mają systemu operacyjnego? – user1824407

+0

plik, gdy masz system operacyjny, powinien mieć jakąś eksplozję na jego temat - jaki to plik i wstępne wersje. – elyashiv

+1

Powiązana odpowiedź: http://stackoverflow.com/a/4519407/17034 –

Odpowiedz

12

W rzeczywistości jest to łącznik , który wykonuje inne zadanie podczas pakowania programu do działania w systemie operacyjnym w porównaniu do tworzenia programu działającego wyłącznie na gołym sprzęcie. Kompilator tworzy jedynie pliki obiektów składające się z instrukcji przeznaczonych dla architektury hosta, a te porcje są później łączone i pakowane przez linker.

Program przeznaczony do pracy w systemie operacyjnym musi mieć określoną strukturę binarną - tutaj zaczynają działać pliki wykonywalne. Taki format może narzucać, że program powinien mieć na początku kilka sekcji nagłówka, a następnie kod powinien na przykład następować. Zadaniem programu ładującego OS jest interpretacja tej struktury, a następnie zasilenie procesora strumieniem instrukcji zawartych w sekcji kodu.

W przeciwieństwie do tego program, który ma działać na gołym sprzęcie, zwykle nie ma specjalnej struktury i może być podawany bezpośrednio do procesora.

+1

Świetne fundamentalne pytanie. Ta odpowiedź zmieniła skupienie dyskusji (poprawnie IMO) z kompilatora. Doskonałe referencje na więcej informacji 1) Artykuły Balau na temat Bare Metal (http: //balau82.wordpress.com/2010/02/14/simplest-bare-metal-program-for-arm /). 2) "format wykonywalny" zobacz Teensy ELF Executables dla systemu Linux (http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html) –

6

Właściwie jest łącznik, który ma inną pracę przy pakowaniu program aby uruchomić w systemie operacyjnym w stosunku do budowy programu, który działa na samej gołej sprzętu. Kompilator tworzy jedynie pliki obiektów składające się z instrukcji przeznaczonych dla architektury hosta, , a te kawałki są później łączone i pakowane przez łącznik.

Program przeznaczony do pracy w systemie operacyjnym musi mieć pewną strukturę binarną - tutaj formaty plików wykonywalnych są odtwarzane w trybie . Taki format może dyktować, że na początku powinien mieć kilka sekcji nagłówka , a następnie kod powinien następować, dla przykładu: . Zadaniem programu ładującego OS jest interpretacja tej struktury , a następnie zasilenie procesora strumieniem instrukcji zawartych w sekcji kodu .

W przeciwieństwie do tego program, który ma działać na gołym sprzęcie , zwykle nie ma specjalnej struktury i może być zasilany bezpośrednio do jednostki centralnej .

Chciałbym wykorzystać tę bardzo dobrze napisaną odpowiedź Blagovesta. Rzeczywiście, jak sugeruje, jest różnica między wykonywalnymi formatami kontenerów a interfejsami binarnymi i tym podobne. Jednak prawdopodobnie największą różnicą jest główny punkt wejścia do wykonania kodu aplikacji, jak również obecność kodu startowego wraz z biblioteką środowiska wykonawczego; chociaż, jeśli wiesz, co robisz, możesz uniknąć łączenia się z tym drugim w pełni rozwiniętym systemie operacyjnym.

Często przy obecności procedur uruchamiania, biblioteki środowiska wykonawczego, takie jak crt0, faktycznym punktem wejścia aplikacji nie jest main, ale coś innego (zazwyczaj _start). Zanim ten faktyczny punkt wejścia przekaże kontrolę do twojego main, może wykonać kilka bardzo specyficznych zadań, zwykle związanych z inicjalizacją.

Zawsze jest Wikipedia dla more information on crt0.

Jednak na platformie bare-metal może nie być takich procedur, które są dołączone do kompilatora. W rezultacie kontrola może zostać przekazana bezpośrednio do twojego main, a pierwszy kod, który ma zostać wykonany na platformie, byłby twój.

Proszę bardzo, jest to najbardziej fundamentalna różnica między dwoma rodzajami main s. Jednak muszę powiedzieć, że twoje pytanie jest trochę nieprecyzyjne, ponieważ możesz je usunąć bez skryptu startowego, jeśli sam zainicjalizujesz stos itp., A także możesz zrobić z biblioteką uruchomieniową, która robi to wszystko na niektórych (najbardziej?) -metalowe platformy. W rzeczywistości zależy to od pakietu kompilatora, platformy, na którą kierujesz, itp.

3

Kusi mnie, aby powiedzieć, że nie ma różnicy. To, co robi kompilator (lub system translacji), zależy w dużej mierze od implementacji; system translacji prawdopodobnie będzie robił różne rzeczy w przypadku systemu Windows niż Linux, mimo że oba te systemy kwalifikują się jako systemy operacyjne.

Główna różnica polega na tym, czy implementacja jest hostowana, czy nie jest to . Jeśli nie jest hostowany, może nawet nie obsługiwać main, a jeśli tak, może nie obsługiwać argumentów main z . Co do implementacji niez hostowanej wymaga lub wymaga dla uruchamiania, to zdefiniowana jest implementacja. Choć istnieje również dużo „realizacji określono” w odniesieniu do uruchomienia w gospodarzem środowisku, realizacja jest wymagane do obsługi main, wracając int oraz z co najmniej dwóch podpisów, a wymagana jest aplikacja aby zapewnić taką funkcję.

Należy pamiętać, że zarówno w przeszłości, jak i dzisiaj wiele implementacji, które można uznać za hostowane, nie jest z różnych powodów. W przeszłości na przykład g ++ udokumentowało się jako niez hostowany (co najmniej gcc), ponieważ nie mieli kontroli i nie mogli zagwarantować części bibliotecznych implementacji. A nawet dzisiaj , C++ Microsoftu można uznać za hostowane tylko wtedy, gdy generuje aplikacje konsoli; Aplikacje Windows nie mają mają main.

0

@BlagovestBuyukliev dostarczył dobrze napisaną odpowiedź.

Chciałbym go nieco rozszerzyć - żaden system operacyjny w rzeczywistości nie oznacza żadnego systemu operacyjnego wdrażanego przez oprogramowanie. Kawałek HW zdolny do wykonywania kodu binarnego ma również protokół, który obsługuje ładowanie programu i wprowadzanie go do CPU i wszystkich pozostałych szczegółów niskiego poziomu. W tym przypadku "OS" jest rzeczywiście obecny jako implementowany przez HW. Od tego momentu różnice między nim a standardowym OS nie są głównymi, lecz technicznymi, jeśli chodzi o wykonanie kodu binarnego.

Powiązane problemy