Chapter 1. Introduction
Basic Terminology
- byte = octets = eight-bit quantities
- vector = array
- L2 = link layer (ethernet)
- L3 = network layer (IP)
- L4 = transport layer (UDP/TCP/ICMP)
- BH = bottom half
- IRQ = interrupt
- RX = reception
- TX = transmission
- frame, packet, segment, message = data unit (사용되는 레이어에 따라 다름)
Common Coding Patterns
- 다른 kernel feature들처럼 networking feature들도 공유 자원(MEM, CPU)을 효율적으로 사용하는것이 중요함.
- 대부분의 feature는 stnadalone이 아니고 다른 kernel components와 상호작용함
- 비슷한 기능들 끼리는 가능한 비슷한 mechanism으로 구현하려고 함
- 추후 kernel code에서 안전하게 메모리 할당하기 같은 일반적인 요구사항을 처리하는 방법과 자주 사용되는 코딩 트릭들을 알아볼 것임
- subsystem (kernel component) = IP나 routing등 major feature 구현체
Memory Caches
- kernel에서는 kmalloc과 kfree를 쓴다
- 메모리 할당/해제가 자주 일어날 것으로 예상되는 경우 kernel component 초기화 루틴은 special memory cache에 할당을 한다.
- memory cache를 사용할 때 호출하는 kernel functions
- kmem_cache_create / kmem_cache_destroy
- kmem_cache_alloc / kmem_cache_free
- cache에 할당/해제하기
- 보통 wrapper를 통해서 호출한다.
주어진 cache에 할당할 수 있는 instance 개수 제한은 kmem_cache_alloc을 감싸는 wrapper에서 하거나 /proc에서 parameter 설정을 통해 할 수 있음.
Caching and Hash Tables
…
Reference Counts
- 메모리 할당/해제 실수로 인한 피해를 최소화 하기 위한 방법으로 reference count를 사용함
- 하지만 완벽하지 않음. 다음과 같은 경우 망함
- 깜빡하고 reference를 해제하지 않음: 메모리 누수
- 깜빡하고 reference를 붙잡지 않음: 메모리 오염 -> kernel panic 가능
- reference count는 다음과 같은 경우 증가할 수 있다
- 자료구조 두개가 밀접하게 연관되어 있을 때
- 타이머가 시작되고 핸들러가 어떤 자료구조에 접근하려고 할 때
- 리스트나 해시테이블에서 성공적으로 lookup하여 포인터를 반환할 때
Garbage Collection
- Asynchronous
- 특정한 event와 관련 없이 주기적으로 실행됨
- Synchronous
- 메모리가 아주 부족해서 async GC를 기다릴 수 없을 때 즉시 메모리를 확보하기 위해 사용
Function Pointers and Virtual Function Tables (VFTs)
- OOP의 methods처럼 사용 가능.
- 널포인터 참조를 방지하기 위해 function pointer는 항상 실행하기 전에 값을 확인해야함
- VFT ~= abstract method
goto Statements
- goto는 예외 처리를 위해 사용될 수 있다.
Vector Definitions
- struct hack
- 구조체 마지막에 길이 0인 배열을 넣어서 optional block으로 활용
Conditional Directives (#ifdef and family)
- 주로 어떤 feature를 kernel이 지원하는지에 따라 다른 동작을 하도록 할 때 사용
Compile-Time Optimization for Condition Checks
…
Mutual Exclusion
…
Conversions Between Host and Network Order
- 서로 다른 endian을 사용하는 시스템끼리 통신을 하는 경우를 고려해야 함
- 따라서 network byte order -> host byte order 변환과 그 반대로 변환이 가능해야함
- htons, htonl, ntohs, ntohl 매크로 사용
Catching Bugs
- 몇몇 function들은 특정한 조건에서 반드시 호출되거나/호출되지 않아야 함
- 이런 경우 BUG_ON이나 BUG_TRAP 매크로를 사용한다
Statistics
- feature에서 특정한 조건의 발생 빈도 등 통계를 내는 것은 유용함
Measuring Time
- kernel에서는 시간을 측정해야 하는 경우가 있음 (예: garbage collection)ㅑ
- 단위는 1 tick = 1/HZ sec, HZ는 architexture-dependent 코드에 의해 초기화 되는 변수
- 1 tick 마다 jiffies 라는 변수가 1씩 증가함
- jiffies로 시간 측정
…
Browsing the Source Code
- function/variable definition 등을 추적할 수 있는 도구를 쓸 것
Dead Code
- kernel 코드를 보다보면 도대체 어떻게 호출되는지 알 수 없는 코드를 만날 수 있음
- 진짜로 dead code임
When a Feature Is Offered as a Patch
…