본문 바로가기

Kernel/Memory Management11

struct page 메모 struct page에 대한 간단한 노트 참고로 64비트 리눅스는 LP64를 사용한다. 이 글에서 자료형의 크기는 LP64에 따라서 서술되었다. Introuction struct page는 페이지 프레임 하나 (보통 4096 바이트)에 대한 정보를 나타내며 64비트 환경에서 일반적으로 64 바이트이다. struct page는 부팅 과정에서 동적으로 할당된다. 부팅이 끝나면 64/4096 = 1.56%의 메모리가 struct page에 사용된다. memory model & struct page page frame number conversion 물리 메모리는 페이지 프레임들의 집합이기 때문에 struct page는 배열의 형태로 관리하는데,어떤 물리 메모리 모델(FLATMEM, SPARSEMEM)를 [1].. 2022. 9. 14.
Virtual Memory: vmalloc(), vm_map_ram() 분석 vmalloc(), vfree()란 커널에는 메모리를 할당하는 다양한 방법이 있다. 페이지 할당자는 물리적으로 연속적인 페이지 프레임을 할당하며, 슬랩 할당자는 order-n 페이지 하나를 같은 크기로 쪼개서 슬랩 객체를 할당한다. 페이지 할당자와 슬랩 모두 물리적으로 연속적인 메모리를 할당한다. 다만 물리 주소로 접근하지는 않고, direct map 영역의 주소를 사용하여 접근한다. 하지만 항상 물리적으로 연속적인 메모리를 할당할 수는 없는데, 할당하려는 메모리의 크기가 클 수록, 메모리가 단편화될 수록 물리적으로 연속적인 메모리를 할당하기가 어려워진다. vmalloc()은 물리적으로 연속적인 메모리를 할당하는 대신, 물리적으로 흩어진 메모리들을 가상 주소 상으로 연속적이도록 페이지 테이블을 초기화한다.. 2022. 7. 13.
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.