로드 및 실행 주소 및 재배치 (2020)

2018은 비교 성장의 자신의 세월 것처럼, 다시 그것을 할 수있는 기록을 열 그래서 여기의 착오 일부의 발견, 플러스 몇 가지 레이아웃 문제 이전에, 2020 년 조금 돌아 보면, 내용을 썼다. (주제는 몇 가지 개념과 함께 사용되는 스크립트의 주소에 연결되어 실제 사용 링커 스크립트의 콘텐츠를 참조 할 수 산출  http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono /ld.html#IDX237  )

2018라는 제목의 컴파일 및 실행 주소, 더 정확한이 있어야 로드 주소실행할 때 주소 (또는 이전 주소), 당신은 또한 도입 할 필요가 메모리 주소를 .

알 필요는 베어 메탈 필요성을 실행하기위한 선택의 프로그램이 메모리에 저장하고 NorFlash 또는 NandFlash 수 있으며 프로그램이 디코딩 프로그램 실행을 읽을 때 메모리에 저장된 정적 메모리, 모든 종류의 저장 전원을 끌 수있는 일반 시작 프로그램입니다 베어 보드 프로그램이 0 주소 코드에서 수행하기 시작, 우리의 프로그램은 또한 자연적으로 0은 프로그램입니다 저장된 메모리 주소 0에서 시작하는 데 필요한 메모리 주소 , 그것을 임의로 결정할 수에 대한 메모리 쓰기의 메모리 주소, 당신은 또한 물론,이 때문에 제대로 작동하려면 베어 보드를 프로그래밍하는, 우리가 주소 0에 프로그램을 저장합니다 위해 필요 부트 프로그램 주소 영 존재로 남아, 프로그램 저장 중간 위치를 작성할 수 있습니다.

그러나 프로그램 및 실행 후, 여러 가지 이유로, 원래의 메모리 주소에서 실행할 수 없습니다, 여기에 이유가있을 수 있습니다 :

1. 우리가 사용 NorFlash 메모리는 읽기 전용 메모리, 프로그램 또는 로컬 변수 및 기타 데이터와 BSS 세그먼트 데이터 정전기에 사용 전역 변수를 일으키는 (실행을 위해 칩 NorFlash 매뉴얼의 사용은 명령이 또한 만 기록 될 수 제공) 따라서 프로그램의 논리에 영향을 수정할 수 없습니다.

2. 0으로 사용하십시오 NandFlash, S3C2440 칩, 예를 들어, NandFlash 사용이 부트 플래시로, 2440 개 NandFlash 메커니즘 최초의 4K 칩 SRAM에 내용을 복사하기 위해 존재, SRAM 주소는 우리 프로그램의 경우이 시간에 프로그램을 실행하려면 더 4K의 크기보다, 그것을 실행하지 않는 프로그램의 원인이됩니다.

그것은 위의 이유의 존재, 우리가 사용할 수있는 메모리, 일반적으로 SDRAM에 이전 프로그램이 필요 때문에 SDRAM이 너무 후 프로그램을 실행하는 것을, 우리는 프로그램에 대한 메커니즘이 필요, 기본 주소는은 0x3000이라고 가정한다이다 은 0x3000 주소 작업이 메커니즘이라고 재배치 는 프로그램은 0x3000 주소를 실행하는 .

런타임 주소가 프로그램의 주소에 관계없이 프로그램이 실행되는 것을 해결하기 위해 저장되는 위치, 실행하고, 프로그램 자체가 고려할 것입니다 런타임 해결 에 실행되도록 모든 전역 변수와 정적 지역 변수와 실행에 다른 데이터 섹션 또는 BSS 세그먼트 데이터를 이러한 글로벌 변수 a로 액세스에 주소를 주소를 지정할 때, 런타임 주소가 0x301F이 코드는, 액세스 또는 과제에 값 0x301F에이 주소를 변수 모두 사용하기 위해 프로그램 저장 문제가 발생이 시간이 필요합니다 재배치은 0x3000 이후의 어드레스 정보를 알 전에 0 주소가 아닌 0x301F이 시간의 값은 정의되지 않은 문제이다. 함수 functionA이 있으면 마찬가지로, 그 런타임 어드레스 0x321F 0x11FF는 자신의 메모리 어드레스가있다 아니지만 어드레스로 점프 절대 점프 명령을 사용하여 위치 결정 정의 런타임 동작이다.

주소 0에 저장된 프로그램이 단순히 출발점입니다 것은 한 프로그램을 실행하고 주소 0에서 실행을 시작하는 것입니다,하지만 프로그램 느낌 (각 명령어의 주소를 결정하기 위해 실제로 컴파일 시간, 당신은 분해 볼 수 있습니다) 주소 런타임 실행은 0x3000, 전역 변수에 대한 액세스, 실행 시간 주소를 통해 액세스 할 수 있습니다 직접 사용 문제가있는 경우. 이 프로그램은, 때문에 사용 위치 독립적 인 코드의 제대로 기능 할 수 있었다 당신이 점프 직접도 문제가 점프 절대적으로 사용하는 경우, 점프 상대적으로하고있다.

재배치 대응 영역은 실행시 데이터 및 어드레스 코드로 채워진, 잘 컴파일 시간에 결정되고, 상기 메모리 어드레스는 모두 "재료."가 필요했다 내가 런타임에 내 자신의 주소를 복사에서 프로그램 메모리 주소를 포함 1. 일반 재배치, 같은 BSS 섹션을 취소합니다.

마지막으로, 로드 어드레스 베어 보드 프로그램, 파일 구조는 컴파일 출력 함 구조 NorFlash 0가 동일한 어드레스에 저장, 즉로드 어드레스의 상대 위치 또한 빈 파일의 크기에 영향을 어드레스 구조에 저장된 주소 일반적으로 방전이 소형화 될 수 있고, 그 실행의 어드레스에 대응하는 어드레스에서 런타임로드 어드레스에 데이터를 복사하기 이전.

지난 2 년 동안 여전히 진행 상황을 설명하지 능력, 생각의 무수한 같이 변경 모든 문자를 구현, 또는 어떤 도움에 차트를 연결하려는 것을 발견했다.

다음 그림은 메모리의 링커 스크립트 파일 최종 분포의 사용에 대해 설명합니다.

우리는 런타임 주소은 0x3000과 0x31FF 있지만, 코드 세그먼트로드 어드레스에 도시 한 바와 같이 0, 데이터 세그먼트의로드 어드레스 0x80에 있다고 가정하고, 부호 길이가 즉시 코드 및 데이터 세그먼트를 로딩 한 후, 0x80으로하는 것으로서 세그먼트의 합이 여기에 주소 0, 0에 메모리 주소, 메모리 주소 우리가 우리 자신을 설정에로드되지 않습니다 제로 주소 NorFlash (저장 지정 크기로 빈 크기는 아닌데 저장 입금 할,로드 주소 단지를 비우하지 않습니다 다음과 같이 구성 대향하지만 운영 요구 칩 코드 균일 부하를 단순화하여) 0 :

 당신은 분명히 상황이 훨씬 무엇 재배치 볼 수있는 그림으로로드 주소 및 실행시 주소.

의심의 환영에, 또한 토론 교환이 제대로 언급되지 않은 것을 지적 환영 경우 용량 제약에 의해 표현, 일부 잘 명확하게 설명되지. 초기의 마음을 잊지 않았다.

게시 19 개 원래 기사 · 원 찬양 7 · 전망 6923

추천

출처blog.csdn.net/G_METHOD/article/details/104508545