본문 바로가기

Kernel64

[Paper] When Poll is Better than Interrupt 운영체제를 처음 공부할 때는 폴링은 디바이스가 작업을 완료하기까지 대기하는 게 시간낭비이므로, IO가 무조건 인터럽트 방식으로 이루어질 거라고 생각했다. 하지만 하드웨어 성능이 미친듯이 좋아지면서 오히려 인터럽트의 오버헤드가 성능에 큰 영향을 미치기도 한다. When Poll is Better than Interrupt는 2012년에 USENIX에서 발표된 논문으로 고성능 디바이스에서 폴링이 인터럽트 방식보다 나을 수 있음을 보여준다. 실제로 블록 레이어에서는 2015년에 폴링 방식이 구현되었다. 네트워크 레이어는 훨씬 더 전인 2000년대 초반부터 NAPI를 통해 폴링을 지원했다. When Poll Is Better than Interrupt | USENIX www.usenix.org Abstract .. 2021. 11. 6.
[Linux Kernel] RCU (Read-Copy-Update) 공부하다보니 여기저기서 RCU가 나와서 이것도 정리를 해야겠다. RCU는 읽기가 대부분인 상황에서 사용하는 동기화 매커니즘이다. 다른 동기화 매커니즘은 읽기와 쓰기에 대한 오버헤드가 발생하지만, RCU는 읽기에 대한 오버헤드가 존재하지 않는다는 특징이 있다. 커널 문서를 보면 사람들이 RCU를 가지고 오해를 많이 한 것 같다. 이렇게 쓰여있다. 그만큼 RCU가 헷갈리는 주제가 아닌가 싶다. 기존에는 RCU가 RCU를 한 가지 진실된 방법으로 설명할 수 있을거라는 잘못된 가정하에 설명되었다. 사람들은 RCU를 서로 다른 과정으로 이해한다. 따라서 이 문서는 여러가지 방법으로 RCU를 설명한다. Notes 이 글은 비실시간 커널(non real-time kernel)에서의 RCU를 설명한다. 실시간 커널에서.. 2021. 11. 5.
[Linux Kernel] kprobe와 kretprobe BPF를 공부하다보니 실행될 함수를 등록할 때 kprobe, kretprobe, uprobe, tracepoint, UDST 등의 다양한 도구를 사용한다고 해서 이러한 도구들을 먼저 정리해보려고 한다. 우선 이 글에선 kprobe와 kretprobe를 정리해본다. kprobe, kretprobe란 kprobe와 kretprobe는 커널 코드에 동적으로 중단점을 삽입하여 사용자가 정의하는 핸들러 함수가 실행되도록 하는 강력한 도구이다. kprobe는 함수 또는 함수에서 특정 오프셋만큼 떨어진 곳에서 핸들러 함수를 실행하게 해주는 도구이다. kretprobe는 함수가 끝난 후에 핸들러 함수를 실행하게 해주는 도구이다. struct kprobe kprobe의 구조체를 간단하게 살펴보자. 꽤나 직관적이기 때문에.. 2021. 11. 2.
[Linux Kernel] BPF/eBPF란 무엇인가 BPF와 관측가능성 BPF 책을 보면 볼수록 흥미로워서 내용을 정리해본다. BPF는 패킷 필터로 시작해서 현재는 리눅스 시스템에 관측가능성을 부여하는 도구이다. 만들어진지는 거의 리눅스 급으로 오래됐는데 최근 5년간 새로운 용도(?)를 발견하면서 많이 핫해진것 같다. 이 글에서는 BPF가 어떤 구조로 되어있는지를 간단하게 설명한다. 더 공부하면서 bcc나 bpftrace에서 어떻게 프로그램을 실행하는지, BPF 관련 프로젝트에 무엇이 있는지 등등을 정리하려고 한다. 예전에도 BPF라는게 있구나 정도는 알았는데 관측가능성이라는 말의 의미가 잘 와닿지 않아서 그냥 스쳐 지나갔었다. BPF는 사용자 공간에서 명령어 몇개만으로 커널을 새로 빌드하지 않고도 커널 코드를 안전하게 수행할 수 있다. 심지어 커널 코드.. 2021. 10. 31.
[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보다 뛰어.. 2021. 10. 24.
[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를 하면 잘못된 라인.. 2021. 10. 16.