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
…