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?
Odpowiedz
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.
Ś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) –
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.
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
.
@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.
- 1. Jaka jest różnica między tymi dwoma?
- 2. Jaka jest różnica między tymi dwoma?
- 3. Jaka jest różnica między tymi dwoma oświadczeniami?
- 4. Jaka jest różnica między tymi dwoma metodami?
- 5. Jaka jest różnica między tymi dwoma oświadczeniami?
- 6. Różnica między systemem() i powłoką()
- 7. Jaka jest różnica między @ViewChild i @ContentChild?
- 8. Jaka jest różnica między? : i ||
- 9. Jaka jest różnica między GetBlobReference i GetBlobReferenceFromServer?
- 10. Jaka jest różnica między Pingback i Trackback?
- 11. Jaka jest różnica między $ i $$?
- 12. Jaka jest różnica między rurami i gniazdkami?
- 13. Jaka jest różnica między scgi i wsgi?
- 14. Jaka jest różnica między unapply i unapplySeq?
- 15. Jaka jest różnica między `alias` i` typedef`?
- 16. Jaka jest różnica między bundle.setup i bundle.require
- 17. Jaka jest różnica między beginTrackingWithTouch i touchBegan?
- 18. Jaka jest różnica między Lazarus i CodeTyphon
- 19. Jaka jest różnica między mock.patch.object (... i mock.patch (
- 20. Jaka jest różnica między TypedArray.getInteger() i TypedArray.getInt()?
- 21. Jaka jest różnica między developer.paypal.com i x.com?
- 22. Jaka jest różnica między NetFx45WebLink i NetFx45RedistLink
- 23. Jaka jest różnica między BrowserAnimationsModule i NoopAnimationsModule?
- 24. Jaka jest różnica między ścieżką klas, systemem plików?
- 25. jaka jest różnica między @ i @@ w module?
- 26. Jaka jest różnica między glTexParameter i glSamplerParameter
- 27. Jaka jest różnica między tymi dwoma deklaracjami funkcji w JavaScript?
- 28. Jaka jest różnica między dwoma typami konstruktorów klas w PHP?
- 29. Jaka jest różnica między Chisel i Lava i CLaSH?
- 30. Jaka jest różnica między @Inject i @Autowired
od kiedy DSP nie mają systemu operacyjnego? – user1824407
plik, gdy masz system operacyjny, powinien mieć jakąś eksplozję na jego temat - jaki to plik i wstępne wersje. – elyashiv
Powiązana odpowiedź: http://stackoverflow.com/a/4519407/17034 –