흔하게 겪게 되는 부팅실패 혹은 부팅 시간의 이슈입니다.

  그 중에서 최근에 겪게된 한가지를 소개하도록 하겠습니다.


  임베디드 보드에서 uboot는 가장 많이 사용하는 부트로더 중의 하나입니다.

  사실 대다수가 사용하고 있는 것이죠


  uboot 는 mkimgae 라는 툴을 이용해서 커널이나 램디스크에 헤더를 붙여 

  부팅시에 헤더를 확인하여 로딩한 데이타가 정확한지를 확인합니다.

  헤더에 있는 체크섬을 확인할 수 있는 기능을 가지고 있는 것이죠


  그래서 커널이나 램디스크의 원래 이미지의 앞단에  64바이트의 데이타를 붙입니다.

  당연히 원이미지를 만들려면 앞의 64바이트를 제거하면 됩니다.


  각설하고요 커널을 빌드시에 보통은 커널의 시작주소를 옵션으로 줄수 있습니다.

  해당 옵션은 다음과 같죠


  UIMAGE_LOADADDR 라는 인자를 이용해서 커널 빌드시에 사용하게 됩니다.


  예를 들면 아래와 같이 하게 됩니다.

  make ARCH=<architecture> UIMAGE_LOADADDR=<kernel load address> <make targets>


  문제는 실제 커널의 로드 주소를 틀리게 주면 어떻게 될까요?

  부팅을 못할까요?


  답은 아니오입니다.

  부팅을 아주 잘 합니다.


  이유는 zImage 를 사용하는게 일반적인데 uncompressing 과정에서 자신의 동작 주소와

  커널이 로딩되어야 하는 주소가 틀리게 되면 재배치를 통해서 압축을 풀수 있도록 하는 

  알고리즘이 들어가 있기 때문입니다.


  그러면 어떤 일이 일어날까요?

  네... 당연히 커널이미지의 압축을 풀기 위해서 자신을 복사하는 과정이 일어나게 되는데

  이때 문제가 발생하게 됩니다.


  부트로더에서 커널로 부팅할때는 일반적으로 캐쉬와 MMU를 끄고 부팅을 합니다.

  당연히 그 상태에서는 상태에서 메모리의 접근 동작이 매우매우 느리게 됩니다.(10배정도는?)


  그런데 그 상태에서 커널의 로딩 주소가 틀리기 때문에 복사과정이 일어나게 되고

  이 동작은 매우 많은 시간을 잡아 먹게 됩니다.


  만약 uncompressing 상태에서 시간을 많이 걸린다면 이부분을 의심해 보세요

  만약 자신이 커널의 로딩해야할 주소를 정확히 모른다면 옵션을 사용하지 마시기 바랍니다.

  커널은 똑똑해서 이미 기본값이 훌륭히 설정되어 있습니다.