[임베디드 시스템] kernel API

이번에는 Kernel API에 대해 공부해보도록 하자.


  • Kernel control flow(그림1을 봐봐)
    • kernel 은 내부 thread(daemon), process context, interrupt context로 나뉜나고 볼 수 있다.
      • process context는 user의 system call에 의해 수행되는 process로, sleep 가능하다.
      • Interrupt context는 device의 interrupt에 의해 수행되는 것으로 sleep 불가능하다.
    • kernel 의 control flow
      • 우리가 알단 main위주의 flow가 아니다. 여러 곳에서 flow가 비처럼 내림
      • 대부분은 process context에서 수동적으로 일어나고, 기본적인 건 thread로 수행되고 있다.

그림1 kernel control flow





  • kmalloc()
    • malloc() VS kmalloc()
      • malloc()
        • user process에서 호출하는 malloc()의 경우 virtual memory에 space를 할당하는 것이다.
        • 즉, 실제 physical memory에는 할당이 되지 않으며, write를 할 때 비로소 physical address로 연결이 된다.
        • physical memory에 contiguous하게 할당되지 않는다.
      • kmalloc()
        •  kernel내에서 호출하는 kmalloc()은 physical memory에 직접 할당한다.
        • contiguous하게 할당하며, page단위로 할당한다.
          • contiguous하기 때문에 fragmentation문제가 발생한다.
          • 이 경우 buddy, slab 등의 알고리즘으로 극복한다. 
그림2 memory 할당
    • void *kmalloc(size_t, int flag) , void kfree(const void* addr)
      • size_t는 size를 의미한다.
        • 실제론 page단위만큼 할당
        • 대체로 PAGE_SIZE = 4KB
        • 최대 32 page까지 할당 가능함
      • flag
        • GFP_KERNEL
          • normal한 방식으로, memory할당이 안될 경우, 할당이 될 때까지 process sleep한다.
          • interrupt context는 sleep이 불가능하기 때문에 사용시 에러
        • GFP_ATOMIC
          • memory할당이 안될 경우 NULL반환
그림2 kmalloc 예시
    • 장단점
      • contiguous하기 때문에 access가 빠르며 DMA가 유리하다
      • fragmentation 문제, error가능성이 존재
  • vmalloc(), vfree()
    • 유저 malloc과 같이 가상 메모리를 할당한다.
    • 따라서 size limit이 전혀 없어 error가 거의 발생하지 않으나,
    • physical contiguous가 불가능하므로 access속도가 낮아지고 DMA buffer사용 못한다.
그림3 vmalloc 예시
  • Low-level page allocation method (왜 low level인진 그림 4를 보자)
    • get_zeroed_page(unsigned int flag)
      • 0으로 초기화된 page를 가져온다.
    • __get_free_page(unsigned int flag)
      • page를 가져온다.
      • alloc_page(flags)와 같은데, 얘는 struct *page를 return한대
    • __get_free_pages(unsigned int flags, unsigned int order)
      • 2^order의 page를 할당한다.
        • 왜? slab, buddy같은 알고리즘에서 size를 2의 n승으로 생각하기 때문이다.
        • 결국 실제 physcial memory할당은 page단위이되, 한번에 2^n pages씩 할당된다고 봐야한다.
      • alloc_pages(flags, order)과 같은애
    • get_order(8192)
      • 8192바이트만큼의 order을 return 한다. 
      • 8192 bytes = 4KB * 2.xxxx 이므로 최소 3page는 할당되야 하니까 order은 2가 됨(2^2)
그림4 malloc() 내의 __get_free_pages()
그림5 order 예시


댓글

가장 많이 본 글