본문 바로가기

Linux Kernel

[Linux Kernel] SLUB 오브젝트 할당/해제 분석 이 글에서는 SLUB을 5.14 기준으로 분석한다. 왜 5.14 기준이냐면 이번에 5.15에서 RT-compatible하게 바뀌었는데 SLUB을 분석하면서 같이 설명하기엔 너무 복잡하기 때문이다. 5.14에서 5.15로 넘어가면서 바뀌는 부분은 별도의 글로 정리해야겠다. SLUB은 Christoph가 SLAB의 설계상 단점을 보완하기 위해서 만든 슬랩 할당자이다. queueing을 최소화하고 대신 CPU에 특정 페이지를 담당하게 해서 TLB miss를 줄인다는 것이 가장 큰 특징이다. 그리고 SLAB보다 디버깅 기능이 좋다. 2.6.23부터 기본으로 SLUB 할당자를 사용하도록 되어있다. SLUB이 대부분의 상황에서 선호된다. 하지만 SLUB이 SLAB을 보완하려고 만들었다고 해서 항상 SLAB보다 뛰어.. 더보기
[Linux Kernel] 부팅 초기에 Abort가 나서 로그가 안보일때 SLUB/SLOB 분석하다가 이것저것 수정해보고있다. 버그가 나서 고쳐야하는데 start_kernel에서 local_irq_enable을 하기만 하면 인터럽트쪽 코드 때문에 디버깅이 안되는데 Oops도 제대로 안보여서 매우 곤란해졌다. 그래서 한 몇시간 삽질하다가 찾은 방법이 gdb 스크립트를 활용하는 것이다. 이런게 있었다니 .. OTL.. gdb -iex 'add-auto-load-safe-path .' vmlinux # gdb 실행 target remote:1234 # 원격 접속 continue # 터질때까지 기다림 ^C # SIGINT 보냄 lx-dmesg # dmesg 보여주는 스크립트 너무 잘보인다... p.s. 왜인지 모르겠으나 l *slob_free+0x140/0x284를 하면 잘못된 라인.. 더보기
[Linux Kernel] slab_common 분석 이 글은 독자가 슬랩에 대한 약간의 이해가 있다고 가정한다. 슬랩을 왜 쓰는지, cache와 slab이 어떤 관계가 있는지, kmalloc/kfree가 무엇인지 정도는 알고 있어야 한다. 아래 두 글을 먼저 읽는 것도 이해에 도움이 될것같다. [Linux Kernel] SL[AUO]B: Kernel memory allocator design and philosophy 내가 SLAB/SLUB을 잘못 이해했는지 Christoph Lameter 아저씨가 발표한 영상을 한 번 보라고 추천해주셨다. 이 글은 SL[AUO]B: Kernel memory allocator design and philosophy를 정리하고 내 의견을 추가로 적은.. hyeyoo.com The Slab Allocator: An Objec.. 더보기
The Elements of Cache Programming Style 코드를 짜다가 캐시를 고려해서 짜야한다는 지적을 받아서 정리해본다. 원문: The Elements of Cache Programming Style (Chris B. Sears, USENIX 2000) Introduction 캐시 메모리는 당근과 채찍의 원리로 작동한다. 당근은 지역성의 원리(Principle of Locality)이고 채찍은 암달의 법칙이다. 지역성의 원리는 컴퓨터의 메모리 접근이 무작위적이지 않고 규칙이 존재한다는 가정에 근거한다. 이때 시간 지역성 (temporal locality)는 한 번 접근한 메모리는 다시 접근할 확률이 높음을 의미하고, 공간 지역성 (spatial locality)는 접근한 메모리의 주변 메모리에 접근할 확률이 높음을 의미한다. 그리고 암달의 법칙은 더 빠른 .. 더보기
[Linux Kernel] SL[AUO]B: Kernel memory allocator design and philosophy 내가 SLAB/SLUB을 잘못 이해했는지 Christoph Lameter 아저씨가 발표한 영상을 한 번 보라고 추천해주셨다. 이 글은 SL[AUO]B: Kernel memory allocator design and philosophy를 정리하고 내 의견을 추가로 적은 것이다. PDF는 여기에 있다. 대부분의 커널 개발자는 (당연히도) 슬랩 할당자와 상호작용을 하게 된다. 슬랩 할당자란 무엇인가?! 기본적으로 메모리 할당은 PAGE_SIZE (4K)로 이루어진다. (그리고 느림) 하지만 작은 크기의 메모리에 대해서는 페이지를 쪼개서 sizeof(struct bio), sizeof(struct sg) 등등 작은 단위로 할당할 수 있고 그게 더 빠르다. 대부분의 서브시스템에서 메모리 할당을 해야하므로 슬랩 할.. 더보기
The Slab Allocator: An Object-Caching Kernel Memory Allocator 이 글은 1994년 Jeff Bonwick (Sun Microsystems)의 The Slab Allocator: An Object-Caching Kernel Memory Allocator를 정리한 것이다. 그나저나 이 논문 우리 큰누나랑 동갑이다. 논문이 나보다 누나잖아..? 1. Introduction 슬랩 할당자는 1994년 Jeff Bonwick이 SunOS 5.4에 도입한 메모리 할당자이다. 이 메모리 할당자는 객체를 할당하고 해제할 때, 메모리를 할당하는 비용보다 생성/소멸시의 비용이 더 높으므로, 이런 생성/소멸 비용을 줄이고자 만들어졌다. 그리고 컬러링(colouring)을 통해 하드웨어 캐시를 최대한 활용하고자 한다. 또한 이 할당자는 통계와 디버깅 기능으로 시스템을 모니터링 하거나 시스.. 더보기
NUMA: Non-Uniform Memory Access NUMA: Non-Uniform Memory Access 메모리 관련 부분을 공부하다보니 NUMA가 많이 나와서 정리해본다. 이 글은 Christoph Lameter의 2013년 문서 "NUMA: An Overview"를 리뷰한 것이다. NUMA는 멀티 프로세서 환경에서 메모리별 접근 속도가 프로세서에 따라 다른 접근 속도 가진 메모리의 형태를 말한다. 일반적인 PC에서는 메모리가 그렇게 많지 않아서 UMA (Uniform-Memory Access)가 많지만, 1990년대 즈음부터 고성능 컴퓨터에 대하여 NUMA를 적용한 컴퓨터가 나오기 시작했다. NUMA에서는 메모리를 노드라는 단위로 나누어지게 되는데, 프로세서마다 노드에 대한 접근 속도가 다르다. 아래 사진은 8개의 프로세서와 2개의 NUMA 노드로.. 더보기
리눅스와 오픈소스에 관한 생각 리눅스와 오픈소스 공부를 시작한 계기 처음 운영체제, 리눅스 커널을 접한건 중학교 쯤이다. 당시에는 나만의 운영체제를 하나 만들어보고 싶었고 (물론 성공적이진 않았지만), 당시엔 해커에 관한 환상이 있었기 때문에 (중2병인지 -_-) 리눅스를 해킹하면 멋있겠다고 생각해서 운영체제 책이랑 리눅스 커널 책 몇권을 읽었다. 물론 지금 생각하면 책의 30%도 이해를 못하긴 했다. 그때는 지금보다 컴퓨터 공학을 잘 몰랐다. 그러다가 학교 도서관에서 한국 오픈소스 개발자들을 소개하는 꾸준히, 자유롭게, 즐겁게라는 책을 우연히 접했다. 책에선 허태준 개발자님을 소개하는데, 2000년대부터 꾸준히 개발에 참여해서 주요 서브시스템을 관리하시는 한국에 몇 안되는 분이다. 멋있기도 했고, 이렇게 먹고 사는 개발자도 있다는게.. 더보기