리눅스 커널에 대한 Q&A 게시판 입니다. (비밀글 체크는 꼭 필요한 경우에만)
안녕하세요! vunmap 관련하여 질문이 있습니다
작성자
정원식
작성일
2019-09-02 13:31
조회
357
vunmap 에서 __vunmap 을 호출할때 두번째 파라미터(deallocate_pages)로 0을 주더라고요
그래서 page를 따로 삭제안하는데 그렇게 하는 이유를 알수 있을까요?
어차피 매핑이 해제되기에 따로 삭제를 안하는건가요?
어느 경우에 deallocate_pages 에 0과 1을 주는지 알려주실수 있으신가요?
참고로 저는 커널 4.6버전으로 공부중입니다!
좋은 자료 올려주셔서 감사합니다!
그래서 page를 따로 삭제안하는데 그렇게 하는 이유를 알수 있을까요?
어차피 매핑이 해제되기에 따로 삭제를 안하는건가요?
어느 경우에 deallocate_pages 에 0과 1을 주는지 알려주실수 있으신가요?
참고로 저는 커널 4.6버전으로 공부중입니다!
좋은 자료 올려주셔서 감사합니다!
그건 간단한 이유입니다.
__vunmap() 함수에 deallocate_pages 인자를 사용하여 두 용도에서 같이 사용할 수 있게 하였습니다.
1) vunmap() 함수에서 이용할 때에는 deallocate_pages=0으로 하여 해당 페이지의 매핑만을 해제하게 요구합니다.
2) vfree() 함수에서 이용할 때에는 vmalloc() 등에서 할당한 메모리를 할당 해제 하기 위해, deallocate_pages=1로 하여 해당 페이지의 매핑을 해제한 후 버디 시스템으로 돌려보내게 합니다.
감사합니다.
그럼 vunmap에서 할당 해제되지 않은 페이지들은
이후에 지연 TLB 플러시를 할때 할당 해제가 되는건가요?
커널에 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 플러시 과정에서 성능이 많이 떨어지기 때문에,
모아 두었다가 한번에 매핑 해제를 하는 방법으로 성능을 향상시키는 기술입니다.
더 많은 성취를 기원합니다.
감사합니다.