이미지

부트로더는 다음 이미지를 사용합니다.

  • 부팅. 이러한 이미지에는 수정되지 않은 mkbootimg를 사용하여 결합된 커널 및 램디스크 이미지가 포함되어 있습니다(구현의 경우 system/core/mkbootimg 참고). 부트로더는 mkbootimg에서 생성된 bootimg.h 헤더 파일을 읽고, 플래시 내 램디스크의 올바른 위치와 크기, 커널의 기본 주소, 명령줄 매개변수 등을 포함하도록 커널 헤더를 업데이트합니다. 그런 다음 부트로더는 부팅 이미지에 지정된 명령줄을 부트로더에서 생성한 명령줄의 끝에 추가합니다.

  • 커널. 이러한 이미지는 표준 Linux 형식(예: zImageImage, Image.gz)을 사용하며 독립적으로 플래시되거나 램디스크 이미지와 결합되거나 boot 파티션으로 플래시되거나 메모리에서 부팅될 수 있습니다. 커널 이미지를 만들 때 기기 트리의 별도의 파티션 대신 연결된 기기 트리 바이너리를 사용하는 것이 좋습니다. 서로 다른 보드 버전에 여러 기기 트리 blob(DTB)을 사용하는 경우 보드 버전을 기준으로 하여 내림차순으로 여러 DTB를 연결합니다.

  • 램디스크. 이 이미지에는 rootfs로 마운트하기에 적합한 루트 파일 시스템이 포함되어 있습니다. mkbootfs를 사용하여 커널 이미지와 결합된 후 부팅 파티션으로 플래시됩니다.

  • 파일 시스템. 이러한 이미지에는 system, userdata, recovery 이미지가 포함되며 Yaffs2 형식이나 스파스 이미지 형식을 사용해야 합니다.

이미지 형식

파일 시스템 이미지는 Yaffs2 형식이나 스파스 이미지 형식일 수 있습니다.

Yaffs2

원시 NAND 저장소를 사용하는 기기는 수정되지 않은 mkyaffs2image에서 생성한 Yaffs2 형식의 이미지를 사용해야 합니다(AOSP의 경우 external/yaffs2/yaffs2/utils 참고). 부트로더는 이러한 이미지를 사용하고, 특정 NAND 하드웨어의 대역 외 영역에 있는 적절한 위치로 yaffs 추가 데이터를 재배치하는 역할을 합니다. 소프트웨어 ECC가 필요한 경우 이번에는 부트로더가 이 계산도 해야 합니다.

이미지 형식에 관한 자세한 내용은 Yaffs2 사양을 참고하세요.

스파스

모든 Android 기기는 스파스 이미지 형식을 지원해야 합니다.

블록 기반 저장소를 사용하는 기기는 ext4f2fs를 지원해야 합니다. 크고 비어 있는 ext4 파일 시스템(예: userdata)을 빠르게 전송하고 플래시하려면 쓰지 않은 상태로 둘 수 있는 파일 시스템 영역에 관한 정보가 포함된 이미지를 스파스 형식으로 저장합니다.

이미지 형식

스파스 이미지 형식에는 파일 헤더와 일련의 청크가 차례대로 포함됩니다. 파일 헤더, 청크 헤더, 청크 데이터는 4바이트의 배수이며 모든 필드는 부호 없는 little-endian입니다.

파일 헤더는 다음 형식을 사용합니다.

  • 32비트 매직: 0xed26ff3a
  • 16비트 주 버전(0x1) - 상위 주 버전이 있는 이미지 거부
  • 16비트 부 버전(0x0) - 상위 부 버전이 있는 이미지 허용
  • 바이트 단위의 16비트 파일 헤더 크기(v1.0에서 28바이트)
  • 바이트 단위의 16비트 청크 헤더 크기(v1.0에서 12바이트)
  • 바이트 단위의 32비트 블록 크기, 4의 배수여야 함
  • 출력 파일의 총 32비트 블록
  • 입력 파일의 총 32비트 청크
  • 원본 데이터의 32비트 CRC32 체크섬. '상관없음'을 표준 802.3 다항식에 따라 0으로 계산합니다(공개 도메인 테이블 구현 사용).

파일 청크는 다음 형식을 사용합니다.

  • 16비트 청크 유형:
    • 0xCAC1 원시(블록 단위의 크기 * 바이트 단위의 블록 크기가 이어짐)
    • 0xCAC2 채우기(4바이트의 채우기 데이터가 이어짐)
    • 0xCAC3 상관없음(0바이트가 이어짐)
  • 16비트 예약(0으로 쓰고 읽기에서는 무시됨)
  • 출력 이미지의 블록 단위로 된 32비트 청크 크기
  • 청크 헤더와 데이터를 포함한 청크 입력 파일의 총 32비트 크기(바이트 단위)

스파스 이미지 만들기

mke2fs 유틸리티를 사용하여 스파스 이미지 형식으로 이미지를 만들 수 있습니다. 이는 부트로더가 읽고 플래시하는 이미지를 만드는 데 사용되는 도구이기도 합니다.

작성기 구현

mke2fs 유틸리티는 이미지의 어떤 영역에 써야 하는지 알고 있으며 이 영역 사이에 '상관없음' 청크를 인코딩합니다. 또 다른 도구인 img2simg는 스파스가 아닌 이미지를 스파스 이미지로 변환합니다. 일반 이미지에는 '상관없음' 영역에 관한 정보가 없습니다. 변환이 가져다 주는 최고의 효과는 반복되는 데이터 블록을 찾아 결과로 나타나는 이미지 크기를 줄이는 것입니다.

판독기 구현

판독기는 알 수 없는 주 버전이 포함된 이미지를 거부하고 알 수 없는 부 버전이 포함된 이미지는 허용해야 합니다. 판독기는 지원하지 않는 청크 크기가 있는 이미지를 거부할 수 있습니다. 주 버전이 검증되면 판독기는 알 수 없는 유형 필드가 있는 청크를 무시해야 하므로 '파일의 청크 크기'를 사용하여 파일의 청크를 건너뛰고 출력에서 '블록 단위의 청크 크기' 블록을 건너뜁니다.

디스크에 기록되는 데이터의 경우 순환 중복 검사(802.3 CRC32)를 계산해야 합니다. 쓰지 않은 모든 영역(상관없음 또는 건너뛴 청크)은 CRC에서 0으로 계산되어야 합니다. 썼거나 건너뛴 블록의 총 개수는 헤더의 '총 블록 수' 필드와 비교되어야 합니다. simg2img 도구는 스파스 이미지 형식을 표준 이미지로 변환하며 이때 스파스 정보는 삭제됩니다.

이미지 플래시

flash 명령어는 호스트 fastboot 도구가 erase 명령어를 먼저 전송하지 않는 한 파티션을 삭제하지 않아야 합니다. 이로 인해 'skip' 블록으로 시작하여 이미 쓰기가 완료된 영역을 탐색하는 스파스 이미지를 다수 사용하는 여러 개의 작은 청크로 하나의 대규모 파티션을 플래시할 수 있습니다. 요청 시 이러한 이미지를 만드는 것은 이미 fastboot 호스트 측 도구에서 처리됩니다.

잠금 해제 모드에서 플래시하기 전에 라디오 및 부트로더 이미지에서 상태 검사를 완료해야 합니다. 예를 들어 빌드에서 생성된 android-info.txt와 비교하여 버전이 일치하는지 확인합니다. 또한 플래시 시간에 부트로더 이미지 서명을 확인하여 부팅(안티롤백 기능이 포함되어 있을 수 있음) 중에 유효성 검사를 통과하도록 합니다.

Google 브랜드 기기의 경우 이전 버전의 부트로더로 플래시하는 작업이 상업용으로 출시된 첫 번째 부트로더부터 올바르게 작동합니다. 빠른 부팅 프로토콜에 관한 자세한 내용은 system/core/fastboot/README.md를 참고하세요.