이 코드는 어떤 문제를 푸나요?
가상 주소 해석을 바꾼 뒤에는 CPU가 저장한 옛 번역도 처리해야 합니다. 이 단원은 v6.18.37의 flush_tlb_all을 읽어 PTE 변경, TLB 무효화, 완료와 명령 동기화가 별도 단계임을 설명합니다.
읽을 범위: v6.18.37 · arch/arm64/include/asm/tlbflush.h · flush_tlb_all 364–370행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.
먼저 알아둘 개념
표와 캐시
PTE는 메모리의 원본 규칙이고 TLB는 CPU가 기억한 번역입니다.
DSB ISHST
앞선 메모리 store가 공유 범위에서 무효화보다 먼저 반영되도록 하는 순서에 사용합니다.
ISB
명령 실행이 갱신된 환경과 맞도록 하는 동기화이며 데이터 캐시 전체 삭제 명령이 아닙니다.
처음 읽을 때
메모리의 PTE를 바꿨는데 CPU가 옛 TLB를 쓰는 경우를 먼저 그려 보십시오.
더 깊이 살펴볼 때
범위별 flush와 ASID별 flush, 페이지 표 메모리 재사용 시점을 함께 비교하십시오.
그림으로 보는 변화

1. 새 표 값 공개
PTE 갱신 뒤 DSB를 수행합니다.
화살표는 store→무효화의 순서입니다.
2. 번역 폐기
TLBI가 해당 범위의 옛 번역을 무효화합니다.
RAM 내용과 주소 번역 상태를 구분합니다.
3. 안전한 후속 실행
완료 helper와 ISB를 통과합니다.
단순히 명령을 발행한 시점보다 뒤의 완료 조건입니다.
flush_tlb_all를 한 줄씩 읽기
줄 번호는 v6.18.37 원문 기준입니다. 주석·빈 줄을 포함한 함수 전체를 먼저 보고, 그 아래에서 각 줄을 설명합니다.
static inline void flush_tlb_all(void)
{
dsb(ishst);
__tlbi(vmalle1is);
__tlbi_sync_s1ish_kernel();
isb();
}static inline void flush_tlb_all(void)커널이 관리하는 EL1 Stage-1 변환을 공유 범위에서 무효화하는 helper입니다. 이름의 all을 모든 장치·모든 Stage-2까지 포함한다고 읽지 않습니다.
dsb(ishst);앞선 페이지 표 store가 inner-shareable 범위에서 무효화보다 앞서도록 DSB ISHST를 수행합니다.
__tlbi(vmalle1is);VMALLE1IS 형태의 TLBI를 발행합니다. EL1 변환을 inner-shareable 범위로 무효화하는 명령이며 일반 RAM 데이터를 지우지 않습니다.
__tlbi_sync_s1ish_kernel();이 helper는 DSB ISH를 수행하고 필요한 반복 TLBI 보완 경로를 호출합니다. 무효화 요청을 보낸 것과 공유 범위에서 완료를 기다리는 것을 구분합니다.
isb();이후 명령 실행이 갱신한 변환 환경과 동기화되도록 ISB를 수행합니다.
함께 생각해 볼 질문
TLB miss는 반드시 page fault입니까?
아닙니다. 유효한 표를 걷고 번역을 얻으면 접근을 계속할 수 있습니다.
모든 PTE 변경에 항상 전체 flush를 씁니까?
아닙니다. 범위와 ASID에 맞는 경로가 있으며 전체 flush는 하나의 경우입니다.
큰 페이지는 어떤 비용을 줄일 수 있습니까?
더 넓은 범위를 적은 TLB 항목과 적은 하위 표로 표현할 수 있으나 단편화·권한 단위의 절충이 있습니다.
출처와 읽은 범위
Linux stable v6.18.37 · arch/arm64/include/asm/tlbflush.h
해당 버전 원본 파일 · 기존 코드 분석 · 설명 원고
