2010-03-02 2 views
2

배경 : 플래시 (0x02000000/2M), SDRAM (0x10000/16M), 프로세서 : ks8695.정적 링크에서 주소를 지정해야하는 이유는 무엇입니까?

부트 로더와 OS가 플래시에 레코딩되면 재설정 할 때 OS가 0x10000의 SDRAM에 복사 된 다음 PC (프로그램 카운터)를 0x10000 (즉, OS를 실행)로 설정하십시오.

PC가 0x10000 (프로세서가이 시점에서 OS의 첫 번째 명령을 실행할 수 있기 때문에) 때문에 OS의 텍스트 섹션의 절대 주소를 지정해야하는 이유 (-Ttext = 0x10000) 그것을 연결할 때? (-T 텍스트를 0x0으로 설정하면 OS가 제대로 실행되지 않습니다.)

안부,

wenlujon

+0

질문을 편집하고 질문에 대답을 넣어 읽기가 쉬워야합니다. – shodanex

+0

아래의 답변은 좋은 답변이며, 다른 답변은 참조 할 수 있습니다. – wenlujon

답변

0

PC가 0x10000에 있으므로 코드가 절대 주소 지정을 수행 중이므로 0x10000에 연결해야합니다.

부트 로더가 링크 또는 심볼 해석을 수행하지 않고 일부 이진 BLOB를 0x10000에 복사 한 다음 PC를 0x10000으로 설정합니다. 따라서 코드는 0x10000에서 실행되도록 준비해야합니다. 즉 링커에서이 코드를 지정해야합니다.

함수 호출은 일반적으로 PC 상대 주소 지정을 사용하여 수행되지만 데이터에 액세스하려는 경우에는 필요하지 않습니다. 테이블 T가 있다고 가정하십시오. 0x0에 링크되어 있고 테이블이 0x1234에있는 경우. 이 주소를 참조하는 지침이있을 수 있습니다.

이제 코드를 0x10000으로 옮깁니다. 귀하의 테이블 주소는 이제 0x11234이지만 귀하의 코드는 이동되지 않았으므로 0x1234에 데이터를로드하려고 시도합니다. 아무 것도 없거나 쓰레기는 없습니다.

이제 코드를 오프셋과 연결하면 T에 액세스하는 데 사용 된 명령 집합이 그에 따라 수정됩니다. 모든 것이 연결을위한 것입니다. 상징을 장래성으로 해결하십시오!

1

난 당신이 종류의 자신의 질문에 대답 생각 - 시스템의 RAM은 0x10000에 위치해 있습니다. 코드 실행의 주된 두 가지 방법은 저장 및 다운로드 (SnD) 및 현장 (XIP)입니다. 플래시에 코드를 저장하고 RAM에 복사하는 것처럼 보입니다. 바이너리의 모든 주소는 RAM 시작 주소로 오프셋되어야합니다. 그렇지 않으면 바이너리에서 잘못 될 것입니다.

플래시가 NOR 인 경우 기술적으로 NOR에두고 해당 플랫폼에 적합하지 않을 수도 있지만 XIP (제자리) 코드를 실행하십시오.

도움이 되었습니까?

0

예, 절대 주소 지정은 좋은 이유이지만 첫 번째 명령은 어떻게됩니까? 절대 주소 지정과 관련이 없어야합니다.

OS의 첫 번째 명령이 0xe1a00000 인 경우 0x000000 오프셋의 명령은 0xe3a01303입니다. -T 텍스트가 0x0으로 설정되면 맵 파일을 조사하여 주소 0x0에서 0xe1a00000, 주소 0x10000에서 0xe3a01303을 얻습니다 (대상 보드의 CPU는 여전히 이것을 전혀 모릅니다).

부트 로더가 OS를 주소 0x10000에 복사하면 0xe1a00000에서 0x10000으로, 0xe3a01303에서 0x20000으로 복사됩니다 (데이터가 아님). 그런 다음 PC를 0x10000으로 설정하면 명령 이 주소 0x10000 인을 차지하지만 CPU는 주소 0x20000에있는 0xe3a01303을 실제로 실행하므로 0xe1a00000을 실행해야합니다.

  1. 0xe1a00000은 SDRAM의 0x10000에 있기 때문에, PC가 0x10000으로 설정 되었기 때문에 CPU가 0xe1a00000을 실행하지 않는 이유는 무엇입니까?
  2. 내 개인용 컴퓨터의 링커에서이 작업을 수행했기 때문에 CPU가 0xe3a01303을 0x10000에 할당 한 것을 어떻게 알 수 있습니까?
+0

첫 번째 글에서 설명한 내용이 아닙니다. 부트 로더에 대한 더 많은 문서가 없으면 어떤 일이 일어나고 있는지 알기가 어렵습니다. ARM 메모리 맵을 변경하는 "재 매핑"옵션이있을 수 있습니다 – shodanex

+0

이 게시물과 첫 번째 차이점을 알려주십시오. "재 매핑"이란 무엇입니까? 위에서 언급 한 이상한 행동을 유발할 수 있습니까? 감사. – wenlujon

+0

대답은 입니다. 1. CPU가 0xe1a00000을 실행합니다. 2. GDB는 0xe3a01303을 실행한다고 생각합니다. -Ttext가 0x10000 (지원되는) 이외의 0x0으로 설정되어 있기 때문에 잘못되었습니다. – wenlujon