본문 바로가기

[리눅스커널]u-boot 퓨징하기

반응형

u-boot은 부트로더다.

그럼 부트로더란? 간단하게 말해 특정 cpu에 OS 혹은 어떤 프로그램을 돌릴 수 있도록 cpu가 동작하는데 필요한 아주 기초적인 부분이나 ROM(or flash),RAM,UART 등의 기본적인 디바이스들을 동작할 수 있게 만드는 프로그램이다.

그래서 인텔 관련 보드(x86)에서 말하는 BIOS와 리눅스에서 많이 쓰이는 LILO(Linux Loader)를 결합한 것이라고 생각하면 이해가 쉽다.

   

부트로더의 종류로는 LILO,GNU GRUB,ARMBOOT, BLOB, bootldr, PPCBOOT, RedBOOT,Angel 등이 있는데 오드로이드에서 사용하는 부트로더는 u-boot이다. LILO와 GEUB에 대해서는 수업에서 CM이 이야기 했듯이 LILO를 대체하기 위해 GRUB이 도입되었다.

부트로더는 보통 NAND와 NOR 플래쉬의 가장 앞부분 즉,어드레스 0번지에 저장된다.(이것도 수업에서 함) ARM CPU에 리셋이 걸리면 PC(Program Count)값이 0번지로 초기화 되는데 이는 메모리맴에서 어드레스 0번지가 시작된다는 의미이다. 그러나 NOR 플래시와는 다르게 NAND플래시의 경우에는 부팅동작을 할 수 없다. 하지만 옛날에 그랬고 지금은 최신 CPU들은 이러한 NAND 플래쉬 부팅을 지원하기 위해 별도의 기능들을 추가했다. 그래서 리셋이 걸리면 DMA제어에 의해 4KB만큼 내부 SRAM으로 복사되고 SRAM의 시작주소를 0번지로 할당하여 부팅동작을 하게한다. 하지만 U-Boot의 크기는 보통 160KB정도 되는데 4KB를 훨씬 넘는 크기이다. 이러한 문제를 해결하기 위해 부트코드의 4KB 이내 코드의 동작은 가장 중요한 기본동작만 하고, 나머지는 시스템의 주메모리 즉,SDRAM에서 동작하게 PC(Program Count)의 위치를 SDRAM 메모리 영역으로 넘겨준다. 따라서 메모리 용량이 작은 SRAM에서 초기 부팅처리는 어셈블러로 코딩이 이루어져 있고 그 뒤 SDRAM으로 복사된 후의 복잡한 처리는 C프로그램으로 작성되어있다.

   

DMA제어(Director Access Controller) - 입출력 장치를 제어 및 기기간의 타이밍 조절, CPU와 입출력 장치의 통신을 담당. 또는 데이터의 버퍼링이나 오류를 검출하는 역할 수행. 한 마디로 입출력 제어기!!!

   

NAND - 직력접근

NOR - 병렬접근

   

그럼 이제 오드로이드에 u-boot 퓨징하는 절차를 정리하면 다음과 같다.

   

1.디버깅 보드와 컴퓨터의 시리얼포트를 RS232C와 TTA20를 이용해서 아래

그림처럼 연결한다.

   

  • 시리얼 통신용 프로그램을 사용하여 연결한다.(하이퍼터미널/SecureCRT을 사용하면 된다. 하이퍼터미널이 쉬워서 하이퍼터미널로 사용.)
  • 시리얼 연결포트를 설정한다. (설정은 다음과 같이 >>> COM port, Baudrate : 115200, DATA : 8, STOP : 1, No-Parity, No Flow Control)
  • 오드로이드를 부팅하면 시리얼통신용 프로그램에 아래와 같은 부팅관련 메시지가 출력된다. 이 때 빠르게 키보드에 아무 버튼을 눌러서 부팅을 멈춘다.

       

  • 이제 시리얼 통신용 프로그램에 아래와 같이 입력한다. dnw명령어를 사용하면 바이너리 파일을 컴퓨터에서 오드로이드로 옮길 수 있다. 여기서 바이너리 파일이란 우리가 만들어 놓은 u-boot.bin 파일이다.

       

   

6. 여기에 USB 케이블을 연결하면 다음과 같이 출력된다.

   

   

7. 그 다음에 드라이버를 잡을 수 있다. 이 드라이버는 디버깅보드 드라이버다.

   

   

   

   

   

10.다음과 같이 설정하면 터미널 창에 아래와 같이 출력된다.

   

   

   

   

반응형
-->