이것 때문에 가끔 에러가 나고 테스트에서 실패를 한다.


  그렇게 큰 메모리를 할당하는 경우는 거의 없지만 그래도 한번씩 이 일이 발생한다.


   아래 코드를 보자


101 struct zb_dma_used_mem* zb_dma_node_alloc(void)

102 {

103     return (struct zb_dma_used_mem *)kzalloc(ZB_DMA_MEM_NODE_SIZE, GFP_KERNEL);

104 }


  그냥 간단히 메모리 할당하는 함수다

  물론 크기는 위에서 결정된다.


  #define ZB_DMA_MEM_NODE_SIZE    SZ_1M


  이것이 실제로는 이렇게 되어 있었다.

  #define ZB_DMA_MEM_NODE_SIZE    (16384 * sizeof(struct zb_dma_node))


  디버깅 코드를 넣다보니 자료구조의 크기가 커졌고 그게 4M 를 넘어 버려다.

  물론 16384 역시 더큰 숫자로 커졌고...


  약 10만개 정도까지 커지니 메모리 할당 에러가 발생했다.  첨에는 몰랐지만


  다시 한번 상기한 것은 커널의 메모리 할당은 최대 크기가 있다.

  64비트가 아닌 32비트... 특히 ARM 에서는 주의 하자


  MAX_ORDER 로 시작되는 메모리 버디시스템에서 할당 가능은 4M 이다. 


  물론 아무리 테스트 코드라도 아래와 같이 해주는 것이 당연합니다만...


     zb_dma_mem = zb_dma_node_alloc();

     if (!zb_dma_mem) {

      printk(" ERRORORORORORORO\n");

     }