2012-12-30 2 views
9

OS가없는 타겟 (Linux라고도 함)과 OS가없는 타겟 (예 : 임베디드 DSP 타겟)에 대해 c/C++ 컴파일러를 사용하여 컴파일 할 때 두 개의 빈 프로그램 main {}을 컴파일 할 때의 차이점은 무엇입니까? 나는 OS가있을 때와 그렇지 않은 경우에 컴파일러가 다르게하는 것을 알고 싶어한다. 두 경우 컴파일러/언어 런타임이 어떻게 다른가요?OS가 있거나없는 두 개의 빈 주 {} 프로그램의 차이점은 무엇입니까?

+4

DSP에 OS가없는 경우? – user1824407

+0

OS를 가지고있을 때 그 파일은 어떤 종류의 파일인지, 어떤 종류의 파일인지, 그리고 premmissions가 있어야합니다. – elyashiv

+1

관련 답변 : http://stackoverflow.com/a/4519407/17034 –

답변

12

실제적으로 링커 운영 체제에서 실행되도록 프로그램을 패키징하는 경우와 별도의 하드웨어에서만 실행되는 프로그램을 빌드 할 때 다른 작업을 수행합니다. 컴파일러는 호스트 아키텍처를 대상으로하는 명령으로 구성된 개체 파일을 생성하기 만하고 이러한 청크는 나중에 링커에서 결합 및 패키지화됩니다.

운영 체제에서 실행되는 프로그램은 특정 바이너리 구조를 가져야합니다. 여기서 실행 가능한 형식이 작동합니다. 이러한 형식은 프로그램이 처음에는 몇 개의 헤더 섹션을 가져야하고 그 다음에 코드가 따라야한다고 지시 할 수 있습니다. 이 구조를 해석 한 다음 코드 섹션에 포함 된 명령어 스트림을 CPU에 공급하는 것은 OS 로더의 임무입니다.

반대로 베어 하드웨어에서 실행되는 프로그램은 일반적으로 특별한 구조가 아니며 CPU에 직접 공급할 수 있습니다.

+1

근본적인 질문입니다. 이 대답은 토론자의 초점을 (정확하게 IMO) 컴파일러에서 멀리 옮겼습니다. 자세한 정보에 대한 훌륭한 참고 자료 1) Bare Metal에 관한 Balau의 기사 (http : //balau82.wordpress.com/2010/02/14/가장 단순한 베어 메탈 프로그램을위한 /). 2) "실행 가능한 형식"은 Linux 용 Teensy ELF 실행 파일 (http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html)을 참조하십시오. –

6

그것은 실제로 프로그램을 빌드 대 운영 체제에서 실행하는 프로그램을 포장 할 때 다른 일을 링커입니다 만 베어 하드웨어 실행됩니다. 컴파일러는 단지 이라는 호스트 아키텍처를 대상으로하는 명령어로 구성된 파일을 생성하며이 덩어리는 나중에 링커에서 결합 및 패키지화됩니다.

운영 체제에서 실행되는 프로그램은 특정 바이너리 구조를 가져야합니다. 여기에서 실행 가능한 형식은 재생이됩니다. 이러한 형식은 프로그램이 처음에 몇 가지 헤더 섹션을 가져야하고 그 다음에 코드가 이어져야한다고 지시 할 수 있습니다 (예 : ). OS 로더는이 구조를 해석하고 코드를 입력 한 다음 섹션에 포함 된 명령어 스트림을 CPU에 공급합니다.

대조적으로 베어 하드웨어에서 실행하려는 프로그램 은 일반적으로 특수 구조가 없으므로 CPU에 직접 공급할 수 있습니다 ( ).

저는 Blagovest가 작성한 매우 잘 작성된 답변을 작성하고 싶습니다. 실제로 그는 실행 가능한 컨테이너 형식과 이진 인터페이스 및 기타 등등의 차이점을 제시합니다. 그러나 가장 큰 차이점은 실제 응용 프로그램 코드의 실행에 대한 기본 진입 점과 런타임 라이브러리와 함께 시작 코드의 존재 여부입니다. 비록 당신이 무엇을하고 있는지 알고 있다면, 본격적인 OS에서 후자와 연결되는 것을 피할 수 있습니다.

시작 루틴이있는 경우 crt0과 같은 런타임 라이브러리에서 종종 응용 프로그램의 실제 진입 점은 main이 아닌 다른 항목 (보통 _start)이됩니다. 이 실제 진입 점이 컨트롤을 사용자의 main으로 가져 오기 전에 대개 초기 작업과 관련된 매우 구체적인 작업을 수행 할 수 있습니다.

항상 more information on crt0에 대한 위키피디아가 있습니다.

그러나 베어 메탈 플랫폼에서는 컴파일러와 함께 번들로 제공되는 루틴이 없을 수 있습니다. 결과적으로 컨트롤이 곧바로 main으로 전달 될 수 있으며 플랫폼에서 실행될 첫 번째 코드가 사용자의 것입니다.

자,이 두 가지 종류의 가장 기본적인 차이점은 main입니다. 그러나, 스택 등을 초기화하는 경우 시작 스크립트없이 수행 할 수있는 것처럼 질문이 다소 모호하다는 말을해야하며 런타임 라이브러리를 사용하여 일부 (대부분?) 맨 위에있는 모든 작업을 수행 할 수도 있습니다 - 금속 플랫폼. 사실이 모든 것은 컴파일러 제품군, 타겟팅하려는 플랫폼 등에 따라 다릅니다.

3

나는 차이가 없다고 말하고 싶습니다. 어떤 컴파일러 (또는 번역 시스템)은 주로 구현 에 종속적입니다. 두 번역 시스템 모두 리눅스보다 윈도우 용으로 다른 것들을 수행 할 가능성이 높습니다.

구현의 주된 차이점은 이 아닌 것입니다. 호스트되지 않으면 main을 지원하지 않을 수도 있고, 그렇지 않은 경우 을 인수로 지원하지 않을 수도 있습니다. 호스트되지 않은 구현이 시작을 위해 을 필요로하거나 구현해야하는 것은 구현이 정의됩니다. 스타트 업에 관해서 "정의 구현"의 많은 호스팅 환경에서, 응용 프로그램이 필요합니다 main을 지원하는 데 필요한, int을 반환하고 두 개 이상의 서명을하고, 된 구현은이 있지만 그러한 기능을 제공한다.

과거와 현재의 많은 구현 인 은 실제로 여러 가지 이유로 호스트되지 않는다고 생각할 것입니다. 예를 들어, g ++는 호스트가 아닌 것으로 (gcc 이상) 문서를 작성했습니다. 제어가 없으므로 구현의 라이브러리 부분을 보장 할 수 없었기 때문입니다. 심지어 오늘은 일 뿐이므로 Microsoft의 C++은 콘솔 응용 프로그램을 생성 할 때만 호스트로 간주 할 수 있습니다. Windows 응용 프로그램에는 이없고 main입니다.

0

@BlagovestBuyukliev는 잘 쓰여진 답변을 제공합니다.

조금 확장하고 싶습니다. OS가 없다는 것은 실제로 소프트웨어 구현 OS가 없음을 의미합니다. 이진 코드를 실행할 수있는 HW 조각에는 프로그램의로드를 처리하고 CPU 및 나머지 모든 하위 수준 세부 정보로 전달하는 프로토콜이 있습니다. 이 경우 "OS"는 실제로 HW로 구현됩니다. 이 시점부터 표준 OS와 다른 점은 이진 코드 실행을 고려할 때 원칙적이지만 기술적 인 것이 아닙니다.

관련 문제