programing

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

kingscode 2022. 8. 25. 22:00
반응형

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

요.kmalloc물리적인 연속적인 메모리 블록을 얻을 수 있습니다.하지만, 또 다른 것은kmalloc원하는 연속된 물리적 블록을 찾을 수 없는 경우 오류가 발생할 수 있습니다.
연속된 메모리 블록의 장점은 무엇입니까?구체적으로는 시스템콜연속된 물리적인 메모리블록이 필요한 이유는 무엇입니까?그냥 사용하지 못한 이유가 있나요?vmalloc
콜 중에 , 「」를 지정할 ?GFP_ATOMIC시스템 콜은 아토믹 컨텍스트에서 실행됩니까?

GFP_ATOMIC
잠이 들다인터럽트 핸들러, 하부 하프 및 sleep이 불가능한 기타 상황에서 사용하는 플래그입니다.

GFP_KERNEL이는 정상적인 할당이며 차단될 수 있습니다.sleep 상태가 안전할 때 프로세스 컨텍스트 코드에서 사용하는 플래그입니다.

물리 주소 버스(PCI 등)의 DMA 디바이스에서 버퍼에 액세스 하는 경우는, 물리적으로 연속하는 메모리를 사용하는 것에 대해서만 걱정할 필요가 있습니다.문제는 많은 시스템콜이 버퍼가 최종적으로 DMA 디바이스에 전달될지 여부를 알 수 없다는 것입니다.버퍼를 다른 커널 서브시스템에 전달하면 버퍼가 어디로 전달될지 알 수 없습니다.커널이 현재 DMA용 버퍼를 사용하지 않더라도 향후 개발에서는 버퍼를 사용할 수 있습니다.

vmalloc은 버퍼 공간을 가상으로 연속된 범위로 재매핑해야 할 수 있기 때문에 종종 kmalloc보다 느립니다.GFP_ATOMIC kmalloc에서 호출하지 않으면 차단할 수 있지만 kmalloc은 재맵하지 않습니다.

kmalloc은 제공할 수 있는 버퍼의 크기가 128KB로*) 제한됩니다.대용량 버퍼가 필요한 경우 부팅 시 대용량 메모리 예약과 같은 vmalloc 또는 기타 메커니즘을 사용해야 합니다.

*) 이것은 초기 커널에도 해당되었다.최근 커널(2.6.33.2에서 테스트)에서는 1kmalloc의 최대 사이즈는 최대 4MB!(이것에 대해상세한 투고를 작성했습니다) - kaiwan.

시스템 콜의 경우 GFP_ATOMIC을 kmalloc()에 전달할 필요가 없습니다.GFP_KERNEL을 사용할 수 있습니다.인터럽트 핸들러가 아닙니다.어플리케이션 코드는 트랩을 통해 커널 컨텍스트에 들어갑니다.인터럽트가 아닙니다.

kmalloc()&vmalloc()함수는 바이트 크기 청크로 커널 메모리를 얻기 위한 간단한 인터페이스입니다.

  1. kmalloc()함수는 페이지가 물리적으로 연속(및 사실상 연속)임을 보증합니다.

  2. vmalloc()와 같은 방법으로 기능하다kmalloc()단, 물리적으로 반드시 연속되지 않고 가상적으로 연속되지 않는 메모리를 할당합니다.

Linux 커널 개발 by Robert Love (제12장, 제3판 244페이지)는 이에 대해 매우 명확하게 답합니다.

네, 대부분의 경우 물리적으로 연속된 메모리가 필요하지 않습니다.커널에서 vmalloc보다 kmalloc이 더 많이 사용되는 주된 이유는 성능입니다.이 책에서는 vmalloc을 사용하여 대용량 메모리 청크를 할당할 때 커널은 물리적으로 연속되지 않은 청크(페이지)를 하나의 연속된 가상 메모리 영역에 매핑해야 한다고 설명합니다.메모리는 사실상 연속적이며 물리적으로 비연속적이기 때문에 페이지 테이블에 여러 개의 가상 주소와 물리 주소의 매핑을 추가해야 합니다.최악의 경우 페이지 테이블에 (버퍼/페이지 크기)매핑 수가 추가됩니다.

이것에 의해, 이 버퍼에 액세스 할 때에, TLB(최근의 가상 주소와 물리 주소의 매핑을 격납하는 캐시 엔트리)에 대한 부담도 증가합니다.로 인해 매질이 발생할 수 있습니다.

간단한 답변: Linux 디바이스 드라이버를 다운로드하여 메모리 관리에 관한 장을 읽습니다.

커널 메모리 관리에 관한 많은 미묘한 문제가 있습니다.이러한 문제를 디버깅하는 데 많은 시간을 할애하고 있습니다.

vmalloc()는 커널이 가상 메모리를 거의 사용하지 않기 때문에 매우 드물게 사용됩니다.kmalloc()는 일반적으로 사용되는 것입니다.그러나 여러 플래그가 어떤 결과를 가져오는지 알아야 하며 특히 인터럽트 핸들러에 있을 경우 플래그가 실패했을 때 발생하는 상황에 대처하기 위한 전략이 필요합니다.

32비트 시스템에서 kmalloc()는 물리 주소에 대한 직접 매핑(실제로 일정한 오프셋이 있음)이 있는 커널 논리 주소(가상 주소)를 반환합니다.이 직접 매핑을 통해 RAM의 연속적인 물리 청크를 얻을 수 있습니다.첫 번째 포인터만 제공하고 그 후 동작을 위해 연속적인 물리 매핑을 기대하는 DMA에 적합합니다.

vmalloc()는 물리적 RAM에 연속 매핑이 없을 수 있는 커널 가상 주소를 반환합니다.대용량 메모리 할당 및 프로세스에 할당된 메모리가 물리적 RAM에서도 연속적인지 여부에 관심이 없는 경우에 유용합니다.

연속된 메모리 블록의 장점은 무엇입니까?구체적으로는 시스템콜에 연속된 물리적인 메모리블록이 필요한 이유는 무엇입니까?vmalloc만 사용할 수 없는 이유가 있나요?

구글의 "I'm Feeling Lucky"에서vmalloc:

넓은 지역이 필요 없는 한 kmalloc을 사용하는 것이 좋습니다.문제는 하드웨어 디바이스 간에 DMA를 하려면 kmalloc을 사용해야 하며, 아마도 더 큰 청크가 필요할 수 있다는 것입니다.해결책은 메모리가 단편화되기 전에 가능한 한 빨리 메모리를 할당하는 것입니다.

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

한편, Vmalloc는 「고메모리」로부터 가상 주소를 반환할 수 있습니다.이러한 주소는 물리적 주소에서 직접 변환할 수 없습니다(virt_to_page 함수를 사용해야 함).

즉, vmalloc와 kmalloc 모두 플래그멘테이션을 수정할 수 있습니다.vmalloc에서는 메모리 매핑을 사용하여 외부 플래그멘테이션을 수정하고 kmalloc에서는 슬래브를 사용하여 내부 플래그멘테이션을 수정합니다.kmalloc에는 다른 장점도 많이 있습니다.

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

반응형