kmalloc 예제

_get_free_pages 및 다른 함수는 kmalloc에 대해 본 것과 동일한 규칙에 따라 언제든지 호출할 수 있다는 점을 강조할 필요가 있습니다. 특히 GFP_ATOMIC를 사용하는 경우 함수가 특정 상황에서 메모리를 할당하지 못할 수 있습니다. 따라서 이러한 할당 함수를 호출 하는 프로그램은 할당 오류를 처리 하기 위해 준비 해야 합니다. 여기서 캐시 인수는 이전에 만든 캐시입니다. 플래그는 kmalloc에 전달 하는 것과 동일 하 고 kmem_cache_alloc 나가서 더 많은 메모리 자체를 할당 해야 하는 경우 상담. kmalloc은 빠른 속도로 설계되었기 때문에 성능 향상은 극적이지 않습니다. 페이지 수준 할당의 주요 장점은 실제로 속도가 아니라 보다 효율적인 메모리 사용입니다. 페이지별로 할당하면 메모리가 낭비되지 않는 반면 kmalloc를 사용하면 할당 세분성으로 인해 예측할 수 없는 양의 메모리가 낭비됩니다. vmalloc을 사용하는 커널의 함수의 예로는 vmalloc을 사용하여 생성되는 모듈에 대한 공간을 얻는 create_module 시스템 호출이 있습니다. 모듈의 코드와 데이터는 나중에 copy_from_user를 사용하여 할당된 공간에 복사됩니다. 이렇게 하면 모듈이 연속 메모리에 로드된 것처럼 보입니다. /proc/kallsyms를 살펴보면 모듈에서 내보낸 커널 기호가 커널에서 내보낸 기호와 다른 메모리 범위에 있는지 확인할 수 있습니다.

커널의 많은 할당은 하드웨어 장치에 연속적으로 나타나야 하는 할당이 거의 없기 때문에 vmalloc()를 사용할 수 있습니다. 사용자 프로세스와 연결된 데이터와 같이 소프트웨어에만 액세스하는 메모리를 할당하는 경우 메모리가 물리적으로 연속될 필요가 없습니다. 그럼에도 불구하고 커널에서 vmalloc()을 사용하는 할당은 거의 없습니다. 대부분은 kmalloc ()를 사용하기로 선택, 그것은 필요하지 않은 경우에도, 부분적으로 역사적 및 부분적으로 성능상의 이유로. 물리적으로 연속된 페이지의 TLB 오버헤드가 크게 줄어들기 때문에 성능 향상을 높이 평가하는 경우가 많습니다. 그럼에도 불구하고 커널에 수십 메가 바이트의 메모리를 할당해야하는 경우 vmalloc()가 최선의 선택입니다. vmalloc의 한 가지 사소한 단점은 내부적으로 kmalloc (GFP_KERNEL)를 사용하여 페이지 테이블에 대한 저장소를 획득하기 때문에 원자 문맥에서 사용할 수 없으므로 절전 모드로 사용할 수 없다는 것입니다. _get_free_page를 인터럽트 처리기에 사용하기에 충분하지 않은 경우 소프트웨어 설계에 약간의 정리가 필요합니다. kfree() 메서드는 kmalloc()로 이전에 할당된 메모리 블록을 해제합니다. 이전에 kmalloc()로 할당되지 않은 메모리또는 이미 해제된 메모리에서 이 함수를 호출하면 커널의 다른 부분에 속하는 메모리를 해제하는 등 매우 나쁜 결과를 초래합니다.

사용자 공간에서와 마찬가지로 할당과 할당의 균형을 조정하여 메모리 누수 및 기타 버그를 방지하십시오. 참고로 kfree(NULL)를 호출하는 것은 명시적으로 확인되고 안전합니다. 메모리 영역의 레이아웃은 아키텍처에 따라 다릅니다. 예를 들어 가장 일반적으로 사용되는 플래그인 GFP_KERNEL은 할당(내부적으로 호출하여 수행되며 결국 GFP_ 접두사 소스인 _get_free_pages)이 커널 공간에서 실행되는 프로세스를 대신하여 수행된다는 것을 의미합니다. 즉, 호출 함수가 프로세스를 대신하여 시스템 호출을 실행하고 있음을 의미합니다. GFP_KERNEL을 사용하면 kmalloc가 메모리가 부족한 상황에서 호출될 때 페이지를 기다리는 현재 프로세스를 절전 모드로 만들 수 있습니다. 따라서 GFP_KERNEL을 사용하여 메모리를 할당하는 함수는 재진입이어야 하며 원자성 컨텍스트에서 실행할 수 없습니다. 현재 프로세스가 절전 모드로 작동하는 동안 커널은 버퍼를 디스크로 플러시하거나 사용자 프로세스에서 메모리를 교환하여 사용 사용 이 사용 되는 메모리를 찾기 위해 적절 한 작업을 수행 합니다. 커널은 페이지 크기의 청크에서만 사용할 수 있는 시스템의 실제 메모리를 관리합니다.