OS없이 실행되는 프로그램을 작성한 사람으로서 나는 확실한 대답을 제공합니다.
실행 파일을 실행하려면 OS 커널이 필요합니까?
그것은 그 프로그램이 어떻게 작성되고 구축되었는지에 달려 있습니다.
OS가 전혀 필요하지 않은 프로그램을 작성할 수 있습니다 (지식이 있다고 가정).
이러한 프로그램은 독립형 으로 설명됩니다 .
부트 로더와 진단 프로그램은 일반적으로 독립형 프로그램에 사용됩니다.
그러나 일부 호스트 OS 환경에서 작성되고 작성된 일반적인 프로그램은 기본적으로 동일한 호스트 OS 환경에서 실행됩니다.
독립형 프로그램을 작성하고 구축하려면 매우 명확한 결정과 조치가 필요합니다.
... 컴파일러의 출력은 머신 코드 (실행 파일)이며 CPU에 대한 지시 사항이라고 생각했습니다.
옳은.
최근에 커널을 읽고 있었고 프로그램이 하드웨어에 직접 액세스 할 수는 없지만 커널을 거쳐야한다는 것을 알았습니다.
이것은 OS가 프로그램을 실행하기 위해 사용하는 CPU 모드에 의해 부과되는 제한이며 컴파일러 및 라이브러리와 같은 특정 빌드 도구에 의해 촉진됩니다.
지금까지 작성된 모든 프로그램에 대한 본질적인 제한은 아닙니다.
그래서 우리가 printf () 함수로 간단한 소스 코드를 컴파일하고 컴파일하면 실행 가능한 머신 코드가 생성됩니다.이 머신 코드의 각 명령은 메모리에서 직접 실행됩니다 (코드가 OS에 의해 메모리에로드되면 ) 또는 머신 코드의 각 명령을 계속 실행하려면 OS (커널)를 거쳐야합니까?
모든 명령어는 CPU에 의해 실행됩니다.
지원되지 않거나 잘못된 명령 (예 : 프로세스에 권한이 충분하지 않은 명령)은 즉시 예외를 발생시키고 대신 CPU는이 비정상적인 조건을 처리하기 위해 루틴을 실행합니다.
의 printf () 함수의 예로서 사용되어서는 안된다 "간단한 소스 코드" .
객체 지향 고급 프로그래밍 언어에서 기계 코드로의 변환은 암시하는 것처럼 사소하지 않을 수 있습니다.
그런 다음 데이터 변환 및 I / O 를 수행하는 런타임 라이브러리에서 가장 복잡한 기능 중 하나를 선택합니다 .
귀하의 질문에 OS (및 런타임 라이브러리)가있는 환경이 명시되어 있습니다.
시스템이 부팅되고 OS에 컴퓨터가 제어되면 프로그램이 수행 할 수있는 작업에 제한이 적용됩니다 (예 : OS에서 I / O를 수행해야 함).
독립형 프로그램 (OS없이)을 실행하려면 OS를 실행하기 위해 컴퓨터를 부팅하지 않아야합니다.
... 머신 코드가 메모리에로드 된 후 어떻게됩니까?
환경에 따라 다릅니다.
독립형 프로그램의 경우 프로그램의 시작 주소로 점프하여 제어권을 넘겨 실행할 수 있습니다.
OS가로드 한 프로그램의 경우 프로그램이 종속 된 공유 라이브러리와 동적으로 링크되어야합니다. OS는 프로그램을 실행할 프로세스를위한 실행 공간을 만들어야합니다.
커널을 거치거나 프로세서와 직접 대화합니까?
머신 코드는 CPU에 의해 실행 됩니다.
그것들은 "커널을 통과 하지 " 않고 " 프로세서와 통신" 하지도 않습니다 .
기계 코드 (op 코드와 피연산자로 구성됨)는 디코딩 된 CPU에 대한 명령이며 작업이 수행됩니다.
아마도 다음 주제는 CPU 모드 일 것 입니다.