Stack Guard

최승혁·2023년 1월 10일
0

1. Page

커널은 메모리를 page를 단위로 다루며, 이와 관련된 메모리 API들이 있다.

  • Page allocator
    • page_address(page) => page의 가상 논리 주소 반환
    • set_page_address(page, address) => 전달 받은 page의 가상 주소를 address로 설정
    • alloc_pages(gfp_mask, order) => 2^order개의 페이지 할당
    • alloc_page(gfpk_mask) => page 1개 할당
    • __get_free_pages(gfp_mask, order) => 내부적으로 alloc_pages를 호출하며 예외처리를 포함하고 있다.
  • Page free
    • free_pages(addr, order) => address에 할당된 page를 2^order개 반환
    • free_page(addr) => address에 할당된 page 하나 반환
  • kmalloc
    • 커널 영역에 연속된 물리 메모리를 할당하는 함수
    • kfree를 통해 반환
  • vmalloc
    • 큰 메모리 공간이 필요할 때 사용
    • 물리 메모리 공간에서 연속적이지 않으나 가상 메모리에서 연속적이다.
    • vfree를 통해 반환

kmalloc은 연속적인 물리 메모리를 할당하기 때문에 메모리 할당 속도가 빠르다. 반면, vmalloc 함수는 물리 메모리에서 연속적이지 않더라도 가상 메모리에서 연속적으로 큰 공간을 할당하기 때문에 느리더라도 메모리를 크게 할당할 수 있다.

2. Stack Guard

커널은 프로세스마다 스택을 생성하여 각 프로세스가 수행할 수 있는 메모리 공간을 할당한다.

일반적으로 프로세스는 User Mode Stack과 Kernel Mode Stack을 각각 가지고 있다.

page를 다루는 커널 모듈을 작성하다 보면, 여러 개의 page를 할당하는 일이 생길 수 있다.

하지만 프로세스에 할당되는 스택의 size(일반적으로 8192kb, 2 pages)는 제한적이기 때문에 Stack guard error를 만날 수 있다.

커널에서 사용되는 Stack Guard Page는 프로세스가 지정된 메모리 공간을 넘지 않도록

stack size의 경계값에 일정한 개수의 page를 할당하고,

이 page에 접근하려 하면 stack guard error를 발생시키는 것이다.

이럴 땐, 동적으로 메모리를 할당하여야 하며, vmalloc을 통해 해결할 수 있다.

참고자료
profile
그냥 기록하는 블로그

0개의 댓글