Lookaside List는 같은 크기의 메모리를 반복적으로 할당, 해제 할 경우 사용합니다. Lookaside List는 메모리를 ExAllocatePool, ExFreePool 함수로 일일이 할당, 해제 하는 것 보다 매우 빠르고 효율적으로 메모리를 사용할 수 있도록 해줍니다.

Lookaside List는 내부적으로 ExAllocatePool과 ExFreePool을 이용하여 메모리를 할당, 해제 합니다. Non Paged Lookaside List와 Paged Lookaside List는 별다른 차이점이 없고, 메모리를 할당, 해제하는 ExAllocatePool, ExFreePool에서 Non Paged인지 Paged인지 차이점만 있을 뿐 Lookaside List 자체의 동작 방식은 동일 합니다.

Lookside List의 구조체는 다음과 같습니다.

typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {

    GENERAL_LOOKASIDE L;

#if !defined(_AMD64_) && !defined(_IA64_)

    KSPIN_LOCK Lock__ObsoleteButDoNotDelete;

#endif

} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;

typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
    GENERAL_LOOKASIDE_LAYOUT
} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;

#define GENERAL_LOOKASIDE_LAYOUT                \
    union {                                     \
        SLIST_HEADER ListHead;                  \
        SINGLE_LIST_ENTRY SingleListHead;       \
    };                                          \
    USHORT Depth;                               \
    USHORT MaximumDepth;                        \
    ULONG TotalAllocates;                       \
생략....

ExInitializeNPagedLookasideList를 이용하여 Lookaside List를 초기화 합니다. 그리고 메모리를 할당 할 때에는 ExAllocateFromNPagedLookasideList를 사용하고, 사용이 끝난 메모리를 해제 할 때에는 ExFreeToNPagedLookasideList를 사용합니다.

여기서 중요한 것이 ExFreeToNPagedLookasideList로 메모리를 해제한다고 해도 실제로 ExFreePool로 메모리를 해제 하지 않습니다. 단지 NPAGED_LOOKASIDE_LIST의 L.ListHead에 해제하려고 했던 메모리의 주소를 넣습니다. (push 동작) L.ListHead는 싱글 링크드 리스트입니다 할당한 메모리에 다음 메모리의 주소를 써넣는 방식으로 링크드 리스트를 만듭니다.

하지만 L.ListHead에 들어있는 주소의 개수가 NPAGED_LOOKASIDE_LIST의 L.Depth보다. 같거나 클 경우 L.FreeMisses에 1을 더하고 ExFreePool로 메모리를 해제 합니다.

ExAllocateFromNPagedLookasideList로 메모리를 할당 할 때 L.ListHead에 할당된 주소가 하나도 없을 경우(pop을 했을 때 하나도 안나왔을 경우)에만 ExAllocatePool로 메모리를 할당하고, 이전에 ExFreeToNPagedLookasideList로 push 해놓은 할당된 메모리 주소가 있으면 이것을 꺼내서 다시 사용합니다.

모든 메모리의 사용이 끝났으면 ExDeleteNPagedLookasideList로 Lookaside List를 삭제하고 할당된 모든 메모리를 해제 합니다.

간단하게 이야기 하면 Lookaside List는 매번 메모리를 할당, 해제 하지 않고 메모리를 할당 할 때 Depth값 만큼 개수를 유지하면서 할당된 메모리 주소를 곧바로 사용하는 방식입니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

17 November 2007