(미완성)평범한 개발자의 C 프로그래밍 이야기

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

linux kernel - ion에서 heap을 등록하는 코드

ion에서 힙을 생성하기 위한 ion_platform_heap 구조체를 봤습니다. 이제 힙을 어떻게 생성하고 처리하는지를 보겠습니다.

  96        for (i = 0; i < dummy_ion_pdata.nr; i++) {
  97                struct ion_platform_heap *heap_data = &dummy_ion_pdata.heaps[i];
  98
  99                if (heap_data->type == ION_HEAP_TYPE_CARVEOUT &&
 100                                                        !heap_data->base)
 101                        continue;
 102
 103                if (heap_data->type == ION_HEAP_TYPE_CHUNK && !heap_data->base)
 104                        continue;
 105
 106                heaps[i] = ion_heap_create(heap_data);
 107                if (IS_ERR_OR_NULL(heaps[i])) {
 108                        err = PTR_ERR(heaps[i]);
 109                        goto err;
 110                }
 111                ion_device_add_heap(idev, heaps[i]);

ion_dummy_driver.c에서 ion_dummy_init() 함수에 힙을 생성하는 ion_heap_create() 함수와 생성된 힙을 등록하는 ion_device_add_heap() 함수를 호출하고 있습니다.

dummy_ion_pdata.heaps는 dummy_heaps를 가르키는 포인터이므로 dummy_heaps 배열을 하나씩 돌아가면서 ion_heap_create()와 ion_device_add_heap()을 호출하고 있다는 것을 알 수 있습니다.

중간에 ION_HEAP_TYPE_CARVEOUT과 ION_HEAP_TYPE_CHUNK 타입의 힙을 등록할 때 base 값이 설정되어있는지 체크하는 부분이 있습니다. 우리가 봐야할 것은 힙의 내부 구조에 대해서는 아무것도 몰라도 ion_platform_heap이라는 데이터를 가지고 있고 데이터를 제대로 설정해놓기만 하면 필요한 힙을 생성할 수 있다는 것입니다.

ion_platform_heap의 내용은 드라이버마다 다를 것입니다. ion_dummy_driver는 ION_HEAP_TYPE_SYSTEM, ION_HEAP_TYPE_SYSTEM_CONTIG, ION_HEAP_TYPE_CARVEOUT, ION_HEAP_TYPE_CHUNK 총 4개의 힙을 가지지만 다른 드라이버는 ION_HEAP_TYPE_SYSTEM 1개의 힙만을 가지고 싶어할 수 있습니다. 아니면 ION_HEAP_TYPE_CARVEOUT 타입의 힙을 여러개 가질 수도 있습니다. 그런 변하는 데이터는 ion_platform_heap에서 표현하는 것입니다.

코드에서는 사용자가 필요에 맞게 만든 데이터 ion_platform_heap 를 가지고 동일하게 처리하기만 하면 됩니다. 각 힙마다 ion_heap_create()와 ion_device_add_heap()만 호출하면 힙이 생성되고 사용할 수 있게 됩니다. 힙마다 내부 구현이 어떻게 되었는지는 알 필요가 없습니다. 최종적으로 ion_alloc이라는 함수를 통해서 힙에서 메모리를 할당받을 수 있습니다.

 

 102/**
 103 * ion_alloc - allocate ion memory
 104 * @client:             the client
 105 * @len:                size of the allocation
 106 * @align:              requested allocation alignment, lots of hardware blocks
 107 *                      have alignment requirements of some kind
 108 * @heap_id_mask:       mask of heaps to allocate from, if multiple bits are set
 109 *                      heaps will be tried in order from highest to lowest
 110 *                      id
 111 * @flags:              heap flags, the low 16 bits are consumed by ion, the
 112 *                      high 16 bits are passed on to the respective heap and
 113 *                      can be heap custom
 114 *
 115 * Allocate memory in one of the heaps provided in heap mask and return
 116 * an opaque handle to it.
 117 */
 118struct ion_handle *ion_alloc(struct ion_client *client, size_t len,
 119                             size_t align, unsigned int heap_id_mask,
 120                             unsigned int flags);

 

heap_id_mask라는 인자가 힙을 구분하는 인자입니다. 만약 ION_HEAP_TYPE_SYSTEM이라는 타입의 힙에서 메모리를 할당받고 싶다면 ION_HEAP_TYPE_SYSTEM을 지정하면 됩니다. ION_HEAP_TYPE_SYSTEM | ION_HEAP_TYPE_SYSTEM_CONTIG로 여러개를 지정할 수 도 있습니다. 힙의 내부 구현은 알 필요가 없습니다. 힙의 내부 구현은 변하는 것이기 때문에 내부 구현에 관련된 사항을 인터페이스에 노출시키면 힙의 내부 구현이 바뀔때마다 인터페이스도 바뀌기 때문입니다.

이렇게 여러개의 힙이 있어도 공통된 데이터를 끌어내서 표준 인터페이스를 만들고 힙의 내부까지 알 필요없이 힙을 사용하도록 만드는게 추상화의 근본 개념입니다. 다시 말하면 여러개의 데이터가 있을 때 변하는 것은 숨기고 변하지 않는 것을 구분해서 공통인 것들을 묶어서 밖으로 노출시키면 추상화가 되는 것입니다.

 

 

댓글

댓글 본문
작성자
비밀번호
버전 관리
gurugio
현재 버전
선택 버전
graphittie 자세히 보기