IT

vmalloc과 kmalloc의 차이점은 무엇입니까?

lottoking 2020. 8. 8. 12:04
반응형

vmalloc과 kmalloc의 차이점은 무엇입니까?


나는 주변을 훑어 본 결과 kmalloc, 연속적인 물리적 메모리 블록을 확보 할 수 있기 때문에 사용하는 것을 옹호하는 대부분의 사람들을 발견했습니다 . 그러나 원하는 kmalloc연속 물리적 블록을 찾을 수없는 경우 에도 실패 할 수있는 것처럼 보입니다 .
연속적인 메모리 블록을 사용하면 어떤 이점이 있습니까? 특히, 시스템 호출 에서 연속적인 물리적 메모리 블록 이 필요한 이유는 무엇입니까? 그냥 사용할 수없는 이유가 있나요? 마지막으로 시스템 호출을 처리하는 동안 메모리를 할당 우선 지정해야 합니까? 시스템 호출이 원자 적 맥락에서 실행 검증?vmalloc
GFP_ATOMIC

GFP_ATOMIC
할당은 우선 순위가 높고 잠들지 언어. 이건, 하반부 및 잠을 잘 수없는 기타 상황에서 사용하는 플래그입니다.

GFP_KERNEL이것은 할당이며 차단 될 수 있습니다. 수면에 안전 할 때 프로세스 프로세스 코드에서 사용할 플래그입니다.


버퍼가 물리적으로 주소가 지정된 버스 (예 : PCI)의 DMA에 의해 액세스되는 경우 물리적으로 연속적인 메모리 사용에 걱정할 필요가 있습니다. 문제는 많은 시스템 호출이 결국 DMA 장치로 전달 명령 여부를 알 수 있습니다. 메시지를 전달하면 다른 메시지 시스템으로 전달하면 실제로 어디로 갈 알 수 없습니다. 이 커널 현재 DMA 버퍼를 사용 용하지 않더라도 향후 개발에서는 그렇게 할 수 있습니다.

vmalloc은 버퍼 공간을 실제 상황 범위로 다시 매핑해야 할 수 있으므로 kmalloc보다 느린 경우가 있습니다. kmalloc은 다시 매핑되지 않지만 GFP_ATOMIC으로 호출 될 수 없습니다. kmalloc이 차단 될 수 있습니다.

kmalloc은 제공 할 수있는 버퍼의 크기가 제한됩니다. 128KB *) . 정말 큰 버퍼가 필요한 경우 vmalloc 또는 부팅시 높은 메모리 예약과 같은 다른 숫자를 사용합니다.

*)이 이전에 해당됩니다. 최근에 (2.6.33.2에서 테스트) 단일 kmalloc의 최대 크기는 최대 4MB입니다! (나는 이것에 대해 상당히 상세한 글을 썼습니다 .) — kaiwan

시스템 호출의 경우 GFP_ATOMIC을 kmalloc ()에 어느 정도 필요가 있는지 GFP_KERNEL을 사용할 수 있습니다. 당신은 성공적이 아닙니다. 애플리케이션 코드는 트랩을 통해 출시되는 출시됩니다. 그것은 아니라가 아닙니다.


간단한 대답 : Linux 장치 드라이버를 다운로드 하고 메모리 관리에 대한 장을 읽어보세요.

진지하게 이해해야 할 메모리 관리와 관련된 미묘한 문제가 많이 있습니다. 문제를 발생하는 데 많은 시간을 할애합니다.

vmalloc ()은 가상 메모리를 거의 사용하지 않습니다. kmalloc ()은 일반적으로 사용하는 것과 다른 플래그의 결과가 무엇인지 알아야하며 실패 할 때 발생하는 상황을 처리하기위한 전략이 필요합니다. 특히 제안한대로 처리기에있는 경우에는 더욱 그렇습니다.


로버트 러브 (Robert Love)의 리눅스 게임 개발 (12 장, 3 판 244 페이지)은 이에 대해 매우 분명하게 대답합니다.

예, 많은 경우에 물리적으로 재현 메모리가 필요하지 않습니다. 에서 kmalloc이 vmalloc보다 많이 사용되는 주된 이유는 성능입니다. 이 책은 vmalloc을 사용하여 큰 메모리 메모리 청크를 할당 할 때 청크 (페이지는 물리적으로 연속되지 않음)를 하나의 연속적인 가상 메모리 영역에 매핑해야합니다. 메모리는 사실상하고 물리적으로 비 연속적이기 때문에 여러 가상-물리적 주소 매핑을 추가해야합니다. 그리고 최악의 경우 페이지 테이블에 추가되는 매핑 수가 있습니다 ( 버퍼 크기 / 페이지 크기) 수 있습니다.

또한이 버퍼에 액세스 할 때 TLB (최근 가상 대 실제 주소 매핑을 저장하는 캐시 항목)에 대한 부담을 추가합니다. 스 래싱으로 이어질 수 있습니다 .


kmalloc()vmalloc()기능 바이트 크기의 청크 고급 메모리를 포함하는 단순한 인터페이스이다.

  1. kmalloc()기능은 페이지가 물리적으로 연속적이며 사실상 연속적임을 보장합니다.

  2. vmalloc()함수는 작동 방식으로 작동합니다 kmalloc(). 단, 가상적으로 만 연속적으로 물리적으로 연속적 일 필요는없는 메모리를 할당한다는 점이 있습니다.


연속적인 메모리 블록을 사용하면 어떤 이점이 있습니까? 특히 시스템 호출에서 연속 된 물리적 메모리 블록이 필요한 이유는 무엇입니까? vmalloc을 사용할 수없는 이유가 있습니까?

Google의 "I 'm Feeling Lucky"에서 제공 vmalloc:

kmalloc은 매우 큰 영역이 필요하지 않은 선호되는 방법입니다. 문제는 일부 하드웨어 장치에서 DMA를 수행해야하는 경우 kmalloc을 사용하며 더 큰 청크가 필요할 수 있습니다. 해결은 메모리가 조각화되기 전에 가능한 한 빨리 메모리를 할당하는 것입니다.


32 비트 시스템에서 kmalloc ()은 물리적 주소에 대한 직접 매핑 (실제로는 시스템 사용)이있는 물리적 주소 (하지만 가상 주소)를 반환합니다. 이 직접 매핑은 연속적인 물리적 RAM 청크를 확보합니다. 초기 포인터 만 제공하고 이후에 작업을 위해 연속적인 물리적 매핑을 기대하는 DMA에 적합합니다.

vmalloc ()은 가상 주소를 반환하며 주소는 물리적 RAM에 연속적인 매핑이 없을 수 있습니다. 대용량 메모리 할당에 유용하며 프로세스에 할당 된 메모리가 물리적 RAM이 연속적이라는 의미에서 신경 쓰지 않는 경우에 유용합니다.


다른 지정 차이점 중 하나는 kmalloc이 논리 주소를 반환한다는 것입니다 (그렇지을 GPF_HIGHMEM 함). 주소는 "낮은 메모리"(물리적 메모리의 첫 번째 기가 바이트)에 배치되고 물리적 주소에 직접 매핑됩니다 (__pa 매크로를 사용하여 변환). 이 속성은 kmalloced 메모리가 연속 메모리임을 의미합니다.

반면에 Vmalloc은 "높은 메모리"에서 가상 주소를 반환 할 수 있습니다. 그 주소는 직접적으로 물리적 주소로 변환 할 수 없습니다 (virt_to_page 함수를 함).

참고 URL : https://stackoverflow.com/questions/116343/what-is-the-difference-between-vmalloc-and-kmalloc

반응형