2016-12-28 2 views
0

읽었습니다 this tutorial왜 링커 스크립트와 시작 코드가 필요합니까?

안내를 따라 코드를 실행할 수 있습니다. 하지만 질문이 있습니다.

1)로드 주소와 런타임 주소가 모두 필요한 이유는 무엇입니까? 우리가 .data도 플래시에 넣었 기 때문에 이해합니다. 그렇다면 우리가 왜 거기서 앱을 실행하지 않고 RAM에 복사하기위한 시작 코드가 필요한가? 우리가 여기 링커 스크립트와 시작 코드를 필요로하는 이유

http://www.bravegnu.org/gnu-eprog/c-startup.html

2). 아래와 같이 C 소스를 빌드하고 qemu로 실행할 수 있습니까?

arm-none-eabi-gcc -nostdlib -o sum_array.elf sum_array.c 

많은 감사

답변

0

1) 데이터 섹션은 변수가 포함되어 있습니다. 변수는 변수이며, 런타임에 변경됩니다. 변수는 런타임에 쉽게 변경할 수 있도록 RAM에 있어야합니다. RAM과 달리 Flash는 런타임에 쉽게 변경되지 않습니다. 플래시는 .data 섹션에있는 변수의 초기 값을 포함합니다. 시작 코드는 .data 섹션을 플래시에서 RAM으로 복사하여 RAM의 런타임 변수를 초기화합니다.

2) 링커 스크립트 : 컴파일러에서 생성 한 개체 코드가 마이크로 컨트롤러의 메모리 맵에 위치하지 않았습니다. 이것은 링커의 역할이며 링커 스크립트가 필요한 이유입니다. 링커 스크립트는 링커에 입력되며 시스템 메모리의 위치와 범위에 대한 지침을 제공합니다.

시작 코드 : main에서 시작하는 C 프로그램은 진공 상태로 실행되지 않지만 환경에 대한 몇 가지 가정을합니다. 예를 들어, main이 실행되기 전에 초기화 된 변수가 이미 초기화되었다고 가정합니다. 시작 코드는 main (즉, "런타임 환경")이 실행될 때 제자리에 있다고 가정되는 모든 것을 넣기 위해 필요합니다. 스택 포인터는 main이 실행되기 전에 시작 코드에서 초기화되는 다른 예제입니다. 그리고 C++을 사용하는 경우 main이 실행되기 전에 정적 객체의 생성자가 시작 코드에서 호출됩니다.

0

1)로드 주소와 런타임 주소가 모두 필요한 이유는 무엇입니까?

대부분의 경우 메모리 매핑 ROM에서 코드를 실행할 수 있지만 종종 코드가 RAM에서 더 빨리 실행됩니다. 경우에 따라 ROM과 응용 프로그램 코드가 ROM에 압축 된 훨씬 더 큰 RAM이있을 수 있으므로 실행 가능 코드가 단순히 압축 해제 된 ROM에서 복사되지 않고 사용 가능한 ROM보다 훨씬 큰 응용 프로그램을 허용 할 수 있습니다.

코드가 NAND 플래시와 같은 메모리에 매핑되지 않은 대용량 저장 미디어에 저장되는 경우 어떤 경우에도 직접 실행할 수 없으며 일종의 부트 로더로 RAM에로드해야합니다.

2) 왜 여기에 링커 스크립트와 시작 코드가 필요한가요? 아래와 같이 C 소스를 빌드하고 qemu로 실행할 수 있습니까?

링커 스크립트는 대상 및 응용 프로그램의 메모리 레이아웃을 정의합니다. 이 튜토리얼은 베어 메탈 프로그래밍을위한 것이기 때문에이를 다루는 OS는 없다. 마찬가지로 스타트 업 코드는 최소한 초기 스택 포인터를 설정하고, 정적 데이터를 초기화하고, main으로 점프해야한다.임베디드 시스템에서는 PLL, 메모리 컨트롤러 등과 같은 다양한 하드웨어를 초기화해야합니다.

2

첫 번째 질문에 대한 답변이 가이드에 나와 있습니다.

운영 체제에서 프로그램을로드하면 .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을 ...에서하지 않고 통화를 할 수 있음을 의미하지만 이러한 툴 체인 중 하나를 다운로드하는 경우 그것은 당신이 실제로 그나마 쓸 필요가 있음을 의미 하는가 링커 스크립트 또는 부트 스트랩.

하지만 아직도 유용한 정보입니다. 시작 코드와 링커 스크립트는 운영 체제 기반 프로그램에도 필요합니다. 운영 체제 용 원시 컴파일러는 대부분 해당 운영 체제 용 프로그램을 작성한다고 가정합니다 결과적으로 해당 툴체인에 링커 스크립트와 시작 코드를 제공합니다.

관련 문제