본문 바로가기

linux kernel23

Direct Map Fragmentation 문제 Direct Map x86 Documentation에서 27.3. Memory Management을 보면 x86_64에서 4단계 or 5단계 페이징이냐에 따라서 가상 주소 공간이 각각 어떤 용도로 쓰이는지 명시되어있다. 이 가상 주소 공간 중 64TB (4-level paging) or 32PB (5-level paging)은 시스템 전체의 물리 메모리를 매핑하는 용도로 사용된다. 이 영역은 가상주소와 물리 주소가 직접 매핑된다. 다시 말해 물리 주소와 가상 주소가 PAGE_OFFSET 만큼만 차이난다. 실제로 물리 주소를 가상 주소로 바꿔주는 __va() 함수의 정의를 보면 #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) 이렇게 물리 주소에서 P.. 2022. 5. 11.
KASAN: Kernel Address SANitizer 최근에 버그의 원인을 찾다가 KASAN을 써볼 일이 생긴 김에 KASAN이 어떻게 동작하는지 정리해보려고 한다. TMI지만 내가 잡으려던 버그는 알고보니 memory corruption 버그가 아니라 KASAN으로 잡지는 못했다. [mail] Overview KASAN은 Andrey Ryabinin이 2015년에 머지된 커널을 위한 address sanitizer이다. [mail] [commit] [lwn] address sanitizer는 모든 메모리 접근 명령어에 대해 해당 접근이 유효한지 확인하는 명령어를 삽입해서 메모리 접근의 유효성을 판별한다. KASAN은 커널을 위한 address sanitizer이다. KASAN은 use-after-free, out-of-bounds access 등의 버그를.. 2022. 4. 9.
Virtual Memory: Transparent Huge Pages Paging Overview 운영체제를 배울때 우리는 페이징이 가상 주소를 물리 주소로 변환하는 매커니즘이고 다단계 페이지 테이블을 사용해서 어떤 가상주소를 어떤 물리주소로 매핑할지 정할 수 있다고 배웠다. 요즘엔 일반적으로 3, 4, 5단계 페이지 테이블을 사용한다. 다단계 페이지 테이블을 사용하는 이유는 fork()할 때 페이지 테이블을 복사하는 비용을 줄이기 위함이고, 페이지 테이블의 단계가 많아질수록 page table walking 비용이 늘어나는 대신 사용할 수 있는 주소의 범위가 늘어난다. 그럼 CPU가 메모리 접근을 할때마다 page table walking을 해야하는가? 그렇지는 않다. 가상 주소를 물리 주소로 변환하려면 적어도 페이지 테이블 단계 수만큼은 메모리 접근을 해야하므로 CPU.. 2022. 3. 23.
Virtual Memory: Node and Zone 이 글은 Mel Gorman의 Understanding The Linux Virtual Memory Manager의 일부를 정리한 것이다. 최신의 가상 메모리 서브시스템과는 내용이 상이할 수 있다. 하지만 기본 개념을 설명하기엔 충분하다고 생각한다. 최신 내용은 필요에 따라서 별도로 글로 정리할 생각이다. Node 메모리의 접근 속도가 균일하지 않은 시스템을 NUMA 시스템이라고 한다. 자세한 건 NUMA 글을 참고하자. NUMA 시스템에서 같은 특성(접근 속도)을 갖는 메모리를 노드라고 한다. 예를 들어서 프로세서 2개(각각 4코어)와 노드 2개가 있을 때는 프로세서에 기준으로 자신에게 가까운 노드(local node)에 접근하는 속도는 빠르고, 먼 노드(remote node)에 접근하는 속도는 느리다.. 2022. 1. 2.
perf로 CPU 샘플링하기 (feat. perf record) 얼마전에 깃헙 블로그에 SL[AUO]B 할당자의 CPU Flame Graph를 간단하게 분석해서 올렸었는데, perf에서 프로파일링 하는 방식을 제대로 모른 채 사용하다보니 결과가 왜곡됐었다. 그래서 간단하게라도 기술적인 부분을 정리하려고 한다. TMI지만 이 글 제목을 원래는 "함수 호출 스택 샘플링"이라고 하려다가, CPU 샘플링/프로파일링이라는 말을 더 많이 쓰는 것 같아서 지금의 제목이 되었다. Sampling 우리는 워크로드에서 어떤 일이 일어나는지를 분석하고 싶어한다. 뭐 캐시 미스나 사이클당 명령어와 같은 PMC (Performance Monitoring Counter)일 수도 있고, 아니면 특정 벤치마크에서 어떤 컴포넌트가 얼마나 CPU를 사용하는지가 궁금할 수도 있다. 간단한 예로 함수 .. 2021. 12. 15.
Virtual Memory: Folio in 5.16 Introduction 저번 개발 주기때 간간이 보이길래 공부했었는데, 5.16에서 folio 패치셋이 드디어 머지되었다. 간단하게 요약해보자면 커널에서 메모리는 페이지 단위로 관리된다. 종종 여러 페이지를 그룹으로 묶어서 하나의 페이지처럼 처리해야할 때가 있는데 이럴때 보통 compound page나 thp (transparent huge pages)를 사용한다. compound page 같은 경우에는 첫 번째의 페이지가 head page이고, 그 외에는 모두 tail page이다 실제로 파일시스템에 compound page를 사용해서 큰 페이지 단위로 처리할 때 성능상의 이점이 있다고 한다. 하지만 compound page를 사용하는 경우에는 이게 head page인 tail page인지 명확하지 않.. 2021. 12. 12.