[임베디드 시스템] 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 예시 |
댓글
댓글 쓰기