본문 바로가기
개발이야기

U-Boot env 이미지 만들기(mkenvimage)

by 코저씨 2024. 11. 28.
728x90

U-Boot의 환경 설정은 기본적으로 환경 변수 영역(env 영역)에 저장됩니다.

이 중복된 환경 설정 영역(redundant env 영역)을 사용하면 시스템 복구가 가능합니다.

U-Boot는 부팅 시 환경 변수 영역을 읽어와 CRC를 확인하고, 저장된 체크섬 값과 비교합니다. 일치하면 그대로 사용하고, 불일치하면 "bad CRC" 메시지를 출력하며 env_set_default 함수를 통해 기본 설정을 사용합니다.

 

env/commom.c 파일의 env_check_redund 함수에서는 crc32(0, tmp_env1->data, ENV_SIZE)를 호출하여 CRC를 비교합니다. 이를 이해하기 위해 다음과 같이 진행했습니다:

  1. mkenvimage -s 0x20000 -o u-boot-env.bin uboot-env-nand.txt 명령어로 bin 파일을 생성했습니다.
  2. 생성된 bin 파일에서 앞 4자리 CRC 값을 제거하고 hxd로 체크섬을 계산한 결과, 정상적인 값을 얻었습니다.


  3. 이 환경 변수 bin 파일을 NAND에 쓰고 부팅했을 때, *** Warning - bad CRC, using default environment *** 메시지가 출력되었습니다.
  4. NAND에 저장된 값을 nand read로 읽어와 md.b로 확인한 결과, 데이터는 정상적으로 쓰여 있었습니다
    (리틀 엔디안 방식이라 CRC 값은 반대로 봐야 합니다).

문제의 원인을 찾기 위해 데모의 env.bin 파일과 비교했더니 1바이트가 차이 나는 것을 확인했습니다.



crc32 함수는 U-Boot의 include/environment.h에 선언된 env_t 구조체를 사용합니다. 이 구조체는 CRC32 값과 데이터 외에도 중복된 영역을 위한 플래그가 추가로 포함되어 있습니다.

이 플래그는 두 개의 환경 변수 영역 중 하나가 손상되면 다른 영역을 불러와 사용하기 위한 것입니다. 이 값 때문에 1바이트가 추가되어 계산이 잘못되었습니다.

 

CRC32 계산 결과는 0x83955e9c였지만, 내가 생성한 bin 파일에서 앞자리 하나를 제거하여 맞았습니다.

 

이를 해결하기 위해 mkenvimage 명령어의 -r 옵션을 사용하여 env bin 파일을 생성했습니다. -r 옵션을 추가하여 생성한 bin 파일은 1바이트가 추가되었으며, NAND에 쓰고 부팅하니 정상적으로 동작했습니다.

 

 

끝.

728x90