compressed/head.S – restart: – 중복 영역 검사를 하여 중복되지 않았다고 판단하면 wont_overwrite(decompress 준비)

 

decompress_head.s분석3

현재 동작되는 compressed 이미지 영역과 decompressed 커널의 경계 영역이 중복되는지 체크하여 중복되는 경우 compressed 커널 이미지를 decompressed 커널 상부로 relocation 한다.

/*
 * Check to see if we will overwrite ourselves.
 *   r4  = final kernel address (possibly with LSB set)
 *   r9  = size of decompressed image
 *   r10 = end of this image, including  bss/stack/malloc space if non XIP
 * We basically want:
 *   r4 - 16k page directory >= r10 -> OK
 *   r4 + image length <= address of wont_overwrite -> OK
 * Note: the possible LSB in r4 is harmless here.
 */
                add     r10, r10, #16384
                cmp     r4, r10
                bhs     wont_overwrite
                add     r10, r4, r9
                adr     r9, wont_overwrite
                cmp     r10, r9
                bls     wont_overwrite
  • add r10, r10, #16384
    • decompressed 커널 주소 밑의 PTE 공간이 compressed 커널의 상부와 겹치는지 확인하려고 r10(end of this image + delta)에 16K를 더한다.
  • cmp r4, r10
    • r4(decompressed 커널 주소)가 r10(compressed 커널 이미지의 끝 주소 + delta)비교하여
  • bhs wont_overwrite
    • 보다 크거나 같으면 wont_overwrite(영역이 중복되지 않음)로 이동
    • decompressed 커널 주소가 현재 수행되는 이미지보다 충분히 위에 있어 중복되지 않다고 판단하였기에 이 경우 리로케이션이 필요 없다.
    • decompressed 커널은 SDRAM의 물리 영역 처음 + offset(0x8000 등)에 위치한다.
      • TEXT_BASE + TEXT_OFFSEET : 시스템마다 다름.
    • 그렇기에 decompressed 커널 주소보다 더 아래에 compressed 커널이 위치한 경우는 보통 플래쉬나 ROM이 SDRAM 보다 물리메모리의 하위에 배치되었고 이주소에서 compressed 커널이 직접 실행된 경우 이 조건을 만족시킨다.
      • 상당 수의 임베디드 장치들은 compressed 커널이 SDRAM으로 옮겨지지 않고 이렇게 ROM에서 동작하여 wont_overwrite로 이동되기도 한다.
  • add r10, r4, r9
    • r10 = r4(decompressed 커널 시작 주소) + r9(decompressed 커널의 사이즈) = 커널의 끝
  • cmp r10, r9
    • r10(decompressed 커널의 끝 주소)와 r9(wont_overwrite 주소) 값을 비교하여
  • bls wont_overwrite
    • r10 <= r9(wont_overwrite)인 경우 wont_overwrite로 이동
    • decompressed될 커널의 끝 주소가 현재 동작중인 코드위치보다 아래에 있어 중복되지 않을 때 wont_overwrite로 이동.
    • 이 케이스는 u-boot 같은 부트로더와 compressed 커널이 SDRAM의 상부에 배치되고 compressed 커널이 있는 SDRAM이 최하부에 배치되어 실행될 때 이러한 경우를 접하게 되며 SDRAM보다 높은 주소에 배치된 ROM이나 플래쉬에서 compressed 커널이 직접 실행하게 되면 역시 이와 같은 조건으로 wont_overwrite로 이동된다.
    • 역시 상당 수의 임베디드 장치들도 이렇게 재배치 없이 decompressed 루틴으로 진입하여 이용되곤 한다.

참고

댓글 남기기