Linux kernel v4.4에서 간단한 블록 장치 드라이버 만들어보기

ida

ida는 ida_get_new_above함수가 핵심입니다.

ida_get_new_above함수는 idr_alloc과 같이 idr_get_empty_slot을 호출해서 pa 배열과 idr_id 값을 얻습니다. idr_alloc은 idr_fill_slot으로 포인터를 트리 노드에 저장했지만 ida는 저장할 포인터가 있는게 아니므로 idr_fill_slot을 호출하지 않습니다.

ida는 idr의 ary 배열을 idr_layer의 포인터로 쓰지 않습니다. 왜냐면 저장할 포인터가 없기 때문입니다. 대신에 비트맵의 포인터로 사용합니다. ida->free_bitmap에 미리 적당한 크기의 비트맵을 할당해놨다가 pa->ary 배열에 비트맵을 포인터를 저장해놓습니다.한 노드에 저장될 비트의 수는 IDA_BITMAP_BITS입니다. 그러므로 최종 id는 "idr_id(노드의 인덱스) * IDA_BITMAPBITS + 비트인덱스"가 됩니다.

만약 모든 비트맵이 1이면 idr_id를 증가합니다. 즉 다음 노드를 가져오는 것입니다. 다음 노드에 비트맵 자체가 아예 없으면 -EAGAIN을 반환합니다.

 

 

댓글

댓글 본문
작성자
비밀번호
graphittie 자세히 보기