본문 바로가기

전체 글142

PIPT / VIVT / VIPT 캐시와 flush_dcache_folio() 오랜만에 글을 쓴다. 이번 글에서는 PIPT, VIPT, VIVT 캐시의 특성을 정리하고 페이지 캐시에서 언제 flush_dcache_folio()를 호출해야하는지 정리해본다. 캐시 복습 우선 캐시를 간단하게 복습해보자. (자세하게는 다루지 않는다!) 캐시는 너무 thrashing이 잦은 direct mapped 캐시나 현실적으로 너무 비싼 fully associative 캐시보다는 set associative 캐시가 주로 사용된다. 아주 엉성하게 그림을 그려봤는데... 위 그림은 같은 인덱스를 갖는 캐시 라인들을 set이라고 부르고, 4-way라서 하나의 set에 4개의 캐시 라인이 있다는 걸 표현하고자 했다. direct mapped 캐시와는 달리 N-way set associative 캐시는 인덱스.. 2022. 6. 25.
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.
KFENCE: Kernel Electric-Fence KASAN: Kernel Address SANitizer 최근에 버그의 원인을 찾다가 KASAN을 써볼 일이 생긴 김에 KASAN이 어떻게 동작하는지 정리해보려고 한다. TMI지만 내가 잡으려던 버그는 알고보니 memory corruption 버그가 아니라 KASAN으로 잡지는 못 hyeyoo.com 바로 저번 글에서 다룬 KASAN은 메모리 접근 시마다 __asan_loadN(), __asan_storeN()을 호출해서 올바른 접근인지를 검증했다. 그런데 메모리에 읽고 쓸때마다 함수를 실행한다는 건 오버헤드가 크기 때문에 production 서버에서는 사용하기 어렵다. KFENCE는 모든 메모리 접근을 추적하는 대신 슬랩에서 할당하는 객체들 중 일부 샘플들에 대해서만 메모리 관련 버그를 탐지한다. KF.. 2022. 4. 17.
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.
Page Cache: write 글을 좀 오랜만에 쓴다. 이것저것 하느라 글을 그동안 못썼다. 흠, 다음 글은 뭐쓰지? 이전 글 VFS: read_iter() & write_iter() 원래는 페이지 캐시를 정리하려고 했는데 정리하다보니 read/write 매커니즘을 정리할 수밖에 없었다. 이 글에선 read_iter()가 어떻게 동작한는지 간단하게 알아본다. 관련 글 이 글은 가상 파일시스 hyeyoo.com Page Cache: filemap_read 이전 글 이전 글에서는 read() 시스템 호출에서 어떤 일이 일어나는지 알아봤다. read() 시스템 호출은 모드와 권한이 적절한지 확인한 후, 1) Direct IO를 수행하거나 2) filemap_read()로 페이지 캐시에서 hyeyoo.com 앞선 글에서 read()를 할 때.. 2022. 3. 9.
Page Cache: filemap_read 이전 글 이전 글에서는 read() 시스템 호출에서 어떤 일이 일어나는지 알아봤다. read() 시스템 호출은 모드와 권한이 적절한지 확인한 후, 1) Direct IO를 수행하거나 2) filemap_read()로 페이지 캐시에서 데이터를 읽어온다는 것을 알아봤다. VFS: read_iter() & write_iter() 원래는 페이지 캐시를 정리하려고 했는데 정리하다보니 read/write 매커니즘을 정리할 수밖에 없었다. 이 글에선 read_iter()가 어떻게 동작한는지 간단하게 알아본다. 관련 글 이 글은 가상 파일시스 hyeyoo.com 페이지 캐시란 디스크의 속도는 어마무시하게 느리다. HDD에서 지연시간이 밀리초 단위로 발생함을 생각했을 때, 중간에 캐시가 없다면 프로세서가 파일의 내용을 .. 2022. 2. 9.
VFS: read_iter() & write_iter() 원래는 페이지 캐시를 정리하려고 했는데 정리하다보니 read/write 매커니즘을 정리할 수밖에 없었다. 이 글에선 read_iter()가 어떻게 동작한는지 간단하게 알아본다. 관련 글 이 글은 가상 파일시스템에 관해 다루므로 VFS가 처음이라면 아래 글을 읽어보자. [Linux Kernel] 가상 파일시스템이란 (VFS, Virtual Filesystem Switch) Virtual Filesystem이란 리눅스를 사용하면 다양한 형식으로 포맷된 디스크를 사용할 수 있다. 보통 리눅스어세는 ext2, ext3, ext4를 사용하지만 윈도우에서 사용하는 NTFS나 FAT같은 디스크도 사용할 수 hyeyoo.com 자료구조 파일 입출력에서 알아볼 자료구조는 크게 kiocb와 iov_iter이다. 내가 파일.. 2022. 1. 24.
다시 정리하는 NUMA NUMA: Non-Uniform Memory Access NUMA: Non-Uniform Memory Access 메모리 관련 부분을 공부하다보니 NUMA가 많이 나와서 정리해본다. 이 글은 Christoph Lameter의 2013년 문서 "NUMA: An Overview"를 리뷰한 것이다. NUMA는 멀티 프로세서 환경.. hyeyoo.com 이전에 정리했던 NUMA 글은 컴퓨터에서 CPU와 접근하려는 물리 주소에 따라서 접근하는 지연시간이 다를 수 있다는 것과, 그래서 왜 메모리 할당자와 스케줄러가 NUMA 아키텍처를 고려해야 하는지, NUMA 아키텍처에서의 allocation policy와 reclamation 등을 다루었다. 그런데 NUMA에 대해서 생각해보니 아직 왜 NUMA라는 방식이 생겼는.. 2022. 1. 21.