← Documents Documentation/arch/arm64/kasan-offsets.sh GitHub 원문 ↗

Linux 6.18.37 · Architecture

arm64 KASAN 섀도 오프셋 계산 스크립트

arm64의 가상 주소 폭과 KASAN 섀도 스케일 시프트 조합별 `KASAN_SHADOW_OFFSET`을 계산하는 26줄 셸 스크립트와 두 결과 표를 설명합니다.

Source pathDocumentation/arch/arm64/kasan-offsets.sh
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

kasan-offsets.sh:1-26

arm64의 가상 주소 폭과 KASAN 섀도 스케일 시프트 조합별 `KASAN_SHADOW_OFFSET`을 계산하는 26줄 셸 스크립트와 두 결과 표를 설명합니다.

첫 번째 함수 인수는 VABITS, 두 번째 인수는 섀도 스케일 시프트입니다. 계산된 상위 32비트 워드 뒤에 32비트 0을 붙여 최종 64비트 오프셋을 만들며, 스크립트는 시프트 3과 4에 대해 각각 다섯 행을 출력합니다.

계산 요약
VABITS 48·47·42·39·36scale shift 3 또는 4상위 워드 산술64비트 KASAN_SHADOW_OFFSET

소스에 고정된 열 가지 조합을 순서대로 계산합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 #!/bin/sh
2
3 # Print out the KASAN_SHADOW_OFFSETS required to place the KASAN SHADOW
4 # start address at the top of the linear region
5
6 print_kasan_offset () {
7 printf "%02d\t" $1
8 printf "0x%08x00000000\n" $(( (0xffffffff & (-1 << ($1 - 1 - 32))) \
9 - (1 << (64 - 32 - $2)) ))
10 }
11
12 echo KASAN_SHADOW_SCALE_SHIFT = 3
13 printf "VABITS\tKASAN_SHADOW_OFFSET\n"
14 print_kasan_offset 48 3
15 print_kasan_offset 47 3
16 print_kasan_offset 42 3
17 print_kasan_offset 39 3
18 print_kasan_offset 36 3
19 echo
20 echo KASAN_SHADOW_SCALE_SHIFT = 4
21 printf "VABITS\tKASAN_SHADOW_OFFSET\n"
22 print_kasan_offset 48 4
23 print_kasan_offset 47 4
24 print_kasan_offset 42 4
25 print_kasan_offset 39 4
26 print_kasan_offset 36 4
27

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와 scale shift상위 워드 주소 마스크섀도 크기 항을 뺌%08x + 00000000 형식화KASAN_SHADOW_OFFSET 표

각 VABITS 값을 두 섀도 스케일 시프트에 대입해 KASAN 섀도 시작 오프셋을 출력합니다.

함수와 출력 형식
구성원문의미
행 머리`printf "%02d\t" $1`첫 번째 인수인 VABITS를 두 자리 십진수와 탭으로 출력
주소 마스크`0xffffffff & (-1 << ($1 - 1 - 32))`VABITS에 따라 선형 주소 영역 상단을 나타내는 상위 워드 구성
섀도 항`1 << (64 - 32 - $2)`스케일 시프트에 해당하는 섀도 주소 간격 계산
최종 주소`printf "0x%08x00000000\n" ...`계산한 32비트 워드 뒤에 하위 32비트 0을 붙여 64비트 오프셋 출력

원문 6-10줄의 함수가 두 인수를 한 행의 표 값으로 바꾸는 과정입니다.

KASAN_SHADOW_SCALE_SHIFT = 3 출력
VABITSKASAN_SHADOW_OFFSET
480xdfff800000000000
470xdfffc00000000000
420xdffffe0000000000
390xdfffffc000000000
360xdffffff800000000

원문 12-18줄이 출력하는 1:8 섀도 매핑용 오프셋입니다.

KASAN_SHADOW_SCALE_SHIFT = 4 출력
VABITSKASAN_SHADOW_OFFSET
480xefff800000000000
470xefffc00000000000
420xeffffe0000000000
390xefffffc000000000
360xeffffff800000000

원문 20-26줄이 출력하는 1:16 섀도 매핑용 오프셋입니다.

원문 줄 좌표
원문 줄구성한국어 해설
1`#!/bin/sh`스크립트를 POSIX 계열 셸로 실행합니다.
2빈 줄인터프리터 선언과 목적 주석을 구분합니다.
3-4목적 주석KASAN 섀도 시작 주소를 선형 영역 상단에 놓기 위한 오프셋을 출력한다고 설명합니다.
5빈 줄주석과 함수 정의를 구분합니다.
6-10`print_kasan_offset()`VABITS와 스케일 시프트로 한 행의 오프셋을 계산하고 출력합니다.
11빈 줄함수 정의와 첫 출력 묶음을 구분합니다.
12-18스케일 시프트 3제목과 열 머리글을 출력하고 다섯 VABITS 값을 함수에 전달합니다.
19`echo`두 출력 표 사이에 빈 줄을 삽입합니다.
20-26스케일 시프트 4두 번째 제목과 열 머리글을 출력하고 같은 다섯 VABITS 값을 계산합니다.

빈 줄도 포함한 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