2013-03-01 3 views
-2

AT91Sam9 ARM 컨트롤러 용 AT91Bootloader가 있습니다. 여분의 하드웨어 초기화를 추가해야하지만 .bin 파일 만 컴파일했습니다. 나는 메모리에 빈 파일을로드하고 전화를 시도 :암 (베어 메탈) : 이진 파일을 함수로 호출합니다.

((void (*)())0x00005000)(); 

그러나이 어떤 결과를하지 않았습니다. 가능한 한 어셈블러를 적게 사용하십시오. 전에 어셈블러에 소개 된 적이 있지만 ARM 어셈블러가 공존하기 때문에 ARM 어셈블러를 이해할 수 없습니다. 부트 로더 중간에서 전화를 걸고 bin 파일 (예를 들어 0x00005000 같은 메모리 섹터에 있음)을 실행 한 다음 부트 로더로 돌아가 자신의 코드를 계속 실행할 수 있습니까?

+1

정보가 너무 작습니다.Btw, 당신이 호출하는 함수가 컴파일되지 않고 0x5000 주소에서 실행되도록 링크되어 있다면, 위의 코드는 작동하지 않을 것입니다. (나는 그 바이너리가 위치 독립적 인 코드만을 포함한다고 생각하지 않습니다.) –

답변

1

ARM 어셈블리는 단순한 어셈블리 중 하나입니다. 매우 간단합니다. 베어 메탈을 계속하고 싶다면 최소한 어셈블리를 배워야합니다. 예를 들어 Alexey의 의견을 이해하십시오.

당신이 찾고있는 명령어는 BX, 주소에 그것을 지점, 다운로드 한 코드를 부트 로더로 분기해야 할 어셈블리입니다 :

.globl tramp 
tramp: 
    bx r0 

는 C 프로토 타입

void tramp (unsigned int address); 
입니다

의견에서 언급 한 바와 같이 프로그램은 실행중인 주소에 대해 컴파일해야하며 위치 독립적이어야합니다. 그렇지 않으면 작동하지 않습니다. 또한 올바른 진입 점을 사용하여 응용 프로그램을 빌드해야합니다. 원시 바이너리이고 바이너리가로드 된 주소로 분기하는 경우 바이너리의 첫 번째 단어를 다음과 같이 사용하여 바이너리를 시작할 수 있어야합니다. 실행을위한 진입 점.

또한 elf 형식 파일에로드하려는 데이터가 포함되어 있지만 전체적으로로드하려는 데이터가 아닙니다. 그것은 "바이너리 파일"입니다. 그렇지만 포함 된 프로그램을 실행하려면로드 가능한 부분을 구문 분석하고 추출하여 올바른 위치에로드해야합니다.

해당 용어의 의미를 모르거나 google을 사용하거나 SO를 검색하면 대답이 나타납니다.

2

ARM Asm이 "너무 복잡하다"면, 발생한 문제를 디버깅하기가 매우 어려울 것입니다. 기본 * ARM 어셈블리는 내가 만난 최소 복잡한 어셈블리 언어 중 하나입니다.

코드 해야합니다 (단, 하드 코딩 된 주소는 사용하지 않지만). ".bin"은 올바른 형식이어야합니다. 일반적인 문제 :

  • 진입 점은 ARM 코드이어야합니다. 일부 컴파일러는 기본적으로 Thumb으로 설정됩니다. Thumb 코드를 작성하는 것이 가능합니다 (약간 힘들 경우).
  • 진입 점은 파일의 시작 부분에 있어야합니다. 해체하지 않고, 제대로했는지 알기가 어렵습니다.
  • 링커는 필요한 경우 "썽크"(a.k.a "스텁")를 삽입합니다. 일부 링커의 특이점은 전에 진입 점 앞에 썽크를 배치 할 수 있음을 의미합니다. --stub-group-size=-1 (docs here)을 사용하여이 문제를 해결할 수 있습니다.

* 시작하지 않아도되는 Thumb/VFP/NEON과 같은 것을 무시합니다.

관련 문제