U-Boot , 부트로더는 보통 NORNAND 플래시의 가장 앞부분 즉, 어드레스 0번지에 저장이 된다. ARM CPU에서 리셋이 걸리면 PC값이 0번지로 초기화되는데 이는 메모리맵에서

어드레스 0번지가 시작된다는 의미이다. 그러나 NOR 플래시와는 다르게 NAND플래시의 경우에는 읽기 동작시 블록단위로 동작을 하기 때문에 순차적인 실행 즉, 부팅 동작을 할 수 없다.

 

따라서 최신 CPU들은 이러한 NAND플래시 부팅을 지원하기 위해 별도의 기능들을 추가했다. 2410 CPU의 경우 리셋이 걸리면 DMA제어에 의해 4KB만큼 내부 SRAM으로 복사되고 SRAM의 시작 주소를 0번지로 할당하여 부팅동작을 하게한다. 하지만 U-Boot의 크기는 보통 160KB 정도 되는데 4KB를 훨씬 넘는 크기이다. 이러한 문제를 해결하기 위해 부트코드의 4KB 이내 코드의 동작은 아주 중요한 기본동작만 하고, 나머지는 시스템의 주메모리 즉, SDRAM에서 동작하게 PC(Program Count)의 위치를 SDRAM 메모리 영역으로 넘겨준다.

 

이렇게 하기 위해서 우선, 부트코드는 두 가지 방식으로 분리된다.

 

1.     시스템의 기본동작을 위한 초기화를 하고, NAND 플래시에 저장된 U-Boot의 전체 이미지를 SDRAM으로 복사한다. 이 동작은 간단하게 어셈블러 언어의 리터럴 풀(상수값 지정) 동작방식으로 메모리 접근이 가능하다.

 

2.     주메모리로 복사된 후 PC SDRAM으로 넘겨줄 때는 주로 복잡한 부팅기능을 지원하기 위해 C 프로그램으로 작성되어 실행이 되는데 이때는 자동변수를 위한 스택과 전역변수 그리고 다양한 라이브러리들이 링크될 수 있는 선형적인 메모리 접근이 용이하도록 절대주소방식을 사용한다.

 

따라서 메모리 용량이 작은 SRAM에서의 초기 부팅처리는 어셈블러로 코딩이 이루어져 있고 그 뒤 SDRAM으로 복사된 후의 복잡한 처리는 C프로그램으로 작성되어 있다.

 

어셈블러로 작성된 start.S의 코드는 CPU의 동작을 위해 비교적 간단하면서도 중요한 초기화 과정을 처리하고 있다. 먼저, CPU동작 모드를 유저모드에서 수퍼바이저(SVC32)모드로 전환하고 동작에 영향을 미칠 수 있는 인터럽트와 기타 하드웨어 기능을 중지하고 시스템 클럭을 설정한다. 또한 메모리 컨트롤러를 설정하고 NAND 플래시에 존재하는 부트코드를 SDRAM의 부트영역으로 복사하고 PC를 넘겨준다. C 프로그램의 실행을 위해 필요한 스택에 대한 설정이 이루어지고 나면 C로 구현된 부트로더의 시작함수를 호출한다.

출처 : http://blog.naver.com/serimo/50090962508

+ Recent posts