요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
#!/bin/sh
# Print out the KASAN_SHADOW_OFFSETS required to place the KASAN SHADOW
# start address at the top of the linear region
print_kasan_offset () {
printf "%02d\t" $1
printf "0x%08x00000000\n" $(( (0xffffffff & (-1 << ($1 - 1 - 32))) \
- (1 << (64 - 32 - $2)) ))
}
echo KASAN_SHADOW_SCALE_SHIFT = 3
printf "VABITS\tKASAN_SHADOW_OFFSET\n"
print_kasan_offset 48 3
print_kasan_offset 47 3
print_kasan_offset 42 3
print_kasan_offset 39 3
print_kasan_offset 36 3
echo
echo KASAN_SHADOW_SCALE_SHIFT = 4
printf "VABITS\tKASAN_SHADOW_OFFSET\n"
print_kasan_offset 48 4
print_kasan_offset 47 4
print_kasan_offset 42 4
print_kasan_offset 39 4
print_kasan_offset 36 4
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
가상 주소 폭과 섀도 스케일별 KASAN_SHADOW_OFFSET 산출
1-26이 셸 스크립트는 arm64에서 KASAN 섀도 영역의 시작 주소를 선형 영역 맨 위에 배치하는 데 필요한 `KASAN_SHADOW_OFFSET` 값을 계산해 표로 출력합니다. 입력 파일이나 명령행 인수는 받지 않으며, 소스에 고정된 다섯 가지 가상 주소 폭 `48`, `47`, `42`, `39`, `36`을 섀도 스케일 시프트 `3`과 `4`에 각각 적용합니다.
`print_kasan_offset()`의 첫 번째 인수는 `VABITS`, 두 번째 인수는 `KASAN_SHADOW_SCALE_SHIFT`입니다. 함수는 먼저 `%02d\t`로 가상 주소 폭을 출력하고, 이어서 32비트 상위 워드를 `%08x`로 만든 뒤 리터럴 `00000000`을 붙여 64비트 16진수 주소 형태로 출력합니다.
산술식의 첫 항 `0xffffffff & (-1 << (VABITS - 33))`은 가상 주소 폭에 맞춘 상위 워드 마스크를 만들고, 둘째 항 `1 << (32 - KASAN_SHADOW_SCALE_SHIFT)`을 빼서 섀도 시작 오프셋의 상위 32비트를 얻습니다. 원문의 `$1 - 1 - 32`와 `64 - 32 - $2`를 각각 정리한 표현이며, 실제 스크립트의 연산 순서와 괄호는 아래 원문 코드에 그대로 보존합니다.
각 VABITS 값을 두 섀도 스케일 시프트에 대입해 KASAN 섀도 시작 오프셋을 출력합니다.
원문 6-10줄의 함수가 두 인수를 한 행의 표 값으로 바꾸는 과정입니다.
원문 12-18줄이 출력하는 1:8 섀도 매핑용 오프셋입니다.
원문 20-26줄이 출력하는 1:16 섀도 매핑용 오프셋입니다.
빈 줄도 포함한 26줄 스크립트의 역할을 범위별로 대응시킵니다.
아래 코드는 Linux v6.18.37 원문 1-26줄 전체입니다. 표시 안정성을 위해 탭만 여덟 칸으로 정규화했으며 shebang, 주석, 함수명, 산술식, 인수, 출력 문자열, 호출 순서와 빈 줄은 변경하지 않았습니다.
#!/bin/sh
# Print out the KASAN_SHADOW_OFFSETS required to place the KASAN SHADOW
# start address at the top of the linear region
print_kasan_offset () {
printf "%02d\t" $1
printf "0x%08x00000000\n" $(( (0xffffffff & (-1 << ($1 - 1 - 32))) \
- (1 << (64 - 32 - $2)) ))
}
echo KASAN_SHADOW_SCALE_SHIFT = 3
printf "VABITS\tKASAN_SHADOW_OFFSET\n"
print_kasan_offset 48 3
print_kasan_offset 47 3
print_kasan_offset 42 3
print_kasan_offset 39 3
print_kasan_offset 36 3
echo
echo KASAN_SHADOW_SCALE_SHIFT = 4
printf "VABITS\tKASAN_SHADOW_OFFSET\n"
print_kasan_offset 48 4
print_kasan_offset 47 4
print_kasan_offset 42 4
print_kasan_offset 39 4
print_kasan_offset 36 4
요약·해설
kasan-offsets.sh:1-26arm64의 가상 주소 폭과 KASAN 섀도 스케일 시프트 조합별 `KASAN_SHADOW_OFFSET`을 계산하는 26줄 셸 스크립트와 두 결과 표를 설명합니다.
첫 번째 함수 인수는 VABITS, 두 번째 인수는 섀도 스케일 시프트입니다. 계산된 상위 32비트 워드 뒤에 32비트 0을 붙여 최종 64비트 오프셋을 만들며, 스크립트는 시프트 3과 4에 대해 각각 다섯 행을 출력합니다.
소스에 고정된 열 가지 조합을 순서대로 계산합니다.