현재 동작되는 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 루틴으로 진입하여 이용되곤 한다.
참고
- start: | 문c
- 영역 검사를 하여 하단부가 중복된 경우만 캐시 on 보류 | 문c
- cache_on: | 문c
- cache_clean_flush: | 문c
- 영역 검사를 하여 하단부가 중복된 경우만 캐시 on 보류 | 문c
- restart: | 문c
- 중복 영역 검사를 하여 중복되지 않았다고 판단하면 wont_overwrite(decompress 준비) – (현재 글)
- wont_overwrite: | 문c