Q&A 게시판

리눅스 커널에 대한 Q&A 게시판 입니다. (비밀글 체크는 꼭 필요한 경우에만)

안녕하세요! vunmap 관련하여 질문이 있습니다

작성자
정원식
작성일
2019-09-02 13:31
조회
357
vunmap 에서 __vunmap 을 호출할때 두번째 파라미터(deallocate_pages)로 0을 주더라고요
그래서 page를 따로 삭제안하는데 그렇게 하는 이유를 알수 있을까요?
어차피 매핑이 해제되기에 따로 삭제를 안하는건가요?
어느 경우에 deallocate_pages 에 0과 1을 주는지 알려주실수 있으신가요?

참고로 저는 커널 4.6버전으로 공부중입니다!
좋은 자료 올려주셔서 감사합니다!
전체 4
  • 2019-09-04 10:21
    안녕하세요?

    그건 간단한 이유입니다.

    __vunmap() 함수에 deallocate_pages 인자를 사용하여 두 용도에서 같이 사용할 수 있게 하였습니다.
    1) vunmap() 함수에서 이용할 때에는 deallocate_pages=0으로 하여 해당 페이지의 매핑만을 해제하게 요구합니다.
    2) vfree() 함수에서 이용할 때에는 vmalloc() 등에서 할당한 메모리를 할당 해제 하기 위해, deallocate_pages=1로 하여 해당 페이지의 매핑을 해제한 후 버디 시스템으로 돌려보내게 합니다.

    감사합니다.

  • 2019-09-05 18:47
    친절한 답변 감사드립니다.
    그럼 vunmap에서 할당 해제되지 않은 페이지들은
    이후에 지연 TLB 플러시를 할때 할당 해제가 되는건가요?

  • 2019-09-06 08:33
    안녕하세요?

    커널에 vmap()을 사용하는 코드들이 많습니다.

    페이지 할당을 버디 시스템에서 하였든,
    아니면 버디 시스템 전에 memblock을 사용하여 reserve 메모리를 할당하였든,
    메모리가 확보된 후에 vmap()을 사용하여 매핑한 경우, vunmap()을 사용하여 언매핑합니다.

    deallocate_pages=0을 사용하는 vunmap()은 언매핑 후 메모리의 해제에 개입하지 않습니다.
    메모리 해제는 vmap() 및 vunmap()을 사용한 코드에서 각각의 방법으로 수행되어야 합니다.

    즉, 다음과 같은 패턴을 사용하겠죠.
    - 메모리 할당 ---> vmap() ---> 사용 ---> vunmap() ---> 메모리 해제(reserve 메모리 사용 시 생략 가능)

    deallocate_pages=1을 사용하여 메모리를 할당 해제하는 경우는 딱 한가지 입니다.
    vmalloc() 호출 시 메모리를 할당하고 내부에서 vmap()이 호출되어 매핑합니다.
    그리고 vmalloc()과 한쌍이 되는 vfree() 호출 시 내부에서 vunmap()이 호출되어 매핑과 메모리를 해제합니다.

    즉, 다음과 같은 패턴을 사용하겠죠.
    - vmalloc() - 내부에서 vmap() ---> 사용 ---> vfree() - 내부에서 __vunmap()

    그리고 잘 이해하시겠지만 지연 TLB 플러시는 매핑 해제만 관련이 있고, 메모리 해제와는 관계없습니다.
    vunmap()을 수행 후 즉각 매핑 해제를 하면 TLB 플러시 과정에서 성능이 많이 떨어지기 때문에,
    모아 두었다가 한번에 매핑 해제를 하는 방법으로 성능을 향상시키는 기술입니다.

    더 많은 성취를 기원합니다.

    감사합니다.

  • 2019-09-07 18:45
    친절한 답변 정말 감사드립니다!!