첫 번째 질문에 대한 답변이 가이드에 나와 있습니다.
운영 체제에서 프로그램을로드하면 .data 섹션 (기본적으로 0이 아닌 전역 변수)이 "바이너리"에서 메모리의 오른쪽 오프셋으로로드되므로 프로그램에서 해당 메모리 위치를 시작할 때 변수에 해당 값이 있음을 나타냅니다.
unsigned int x=5;
unsigned int y;
C 프로그래머는 위의 코드를 작성하고 처음 사용을 시작할 때 x가 5가 될 것으로 예상합니까? 글쎄, 베어 메탈로 부팅하는 경우 운영 체제를 사용하지 않아도 램에서 그 값을 복사 할 수 있습니다. 누군가는 그것을해야합니다. 더 .data 물건의 모든 플래시에 있어야합니다, 그 번호 5 어딘가에 플래시에 그렇게 RAM에 복사 할 수 있어야합니다. 따라서 플래시 주소와 램 주소가 필요합니다. 똑같은 두 주소.
그리고 두 번째 질문에 답하기 시작합니다. 여러분이 작성한 C 코드의 모든 줄은 모든 함수가 다른 함수를 호출 할 수 있다고 가정합니다. 기능을 호출 할 수 있기를 원하십니까? 그리고 지역 변수를 가질 수 있기를 원하고 위의 변수 x를 5로 설정하고 y가 0으로 가정합니다. 감사하게도 컴파일러가 경고를하기 시작합니다. 일반 C에 대한 최소한의 시작 코드는 스택 포인터를 설정하여 다른 함수를 호출하고 지역 변수를 가지며 한 줄 또는 두 줄의 코드를 길게 만들 수 있습니다. 위의 y 변수가 .bss가되도록합니다. 는 0이고 값 5를 램에 복사하여 x가 엔트리 포인트 C 함수가 실행될 때 준비가 완료되도록합니다.
운영 체제가 없다면이 작업을 수행하는 코드가 있어야하며 예, 시작과 링커 스크립트가 이미있는 다양한 플랫폼 용으로 설치되는 많은 많은 샌드 박스와 툴체인이 있습니다. 단지
gcc -O myprog.elf myprog.c
이제 나던은 시스템 등 시스템 ...의 printf, fopen을 ...에서하지 않고 통화를 할 수 있음을 의미하지만 이러한 툴 체인 중 하나를 다운로드하는 경우 그것은 당신이 실제로 그나마 쓸 필요가 있음을 의미 하는가 링커 스크립트 또는 부트 스트랩.
하지만 아직도 유용한 정보입니다. 시작 코드와 링커 스크립트는 운영 체제 기반 프로그램에도 필요합니다. 운영 체제 용 원시 컴파일러는 대부분 해당 운영 체제 용 프로그램을 작성한다고 가정합니다 결과적으로 해당 툴체인에 링커 스크립트와 시작 코드를 제공합니다.