DPDK 메모리 관리 1: 구조 체

7091 단어 DPDK
DPDK 의 메모리 관리 작업 은 주로 몇 가지 큰 부분 에 분포 되 어 있 습 니 다. 큰 페이지 초기 화 와 관리, 메모리 관리.큰 페이지 를 사용 하면 페이지 비용 을 줄 일 수 있 으 며, TBL miss 로 인 한 성능 손실 을 최소 화하 기 위해 서다.큰 페이지 를 기반 으로 DPDK 는 이 부분의 메모 리 를 더욱 세분 화하 여 분배, 회수 가 더욱 편리 하 게 한다.큰 페이지 메모리 의 기본 원 리 는 앞에서 이미 설명 되 었 으 며, 여 기 는 계속 되 지 않 습 니 다.
먼저 DPDK 메모리 와 관련 된 구조 체 를 익 혀 보 세 요.
  • struct rte_mem_config (rte eal memconfig. h) 이 데이터 구조 mmap 에서 파일 / var / run /. rteconfig 에서 주 / 프로 세 스 가 이 파일 에 접근 하여 이 데이터 구조 에 대한 공 유 를 실현 합 니 다.프로그램 마다 rte 사용config .mem_config 이 구조 에 접근 합 니 다
  • /**
     * the structure for the memory configuration for the RTE.
     * Used by the rte_config structure. It is separated out, as for multi-process
     * support, the memory details should be shared across instances
     */
    struct rte_mem_config {
        volatile uint32_t magic;   /**< Magic number - Sanity check. */
    
        /* memory topology */
        uint32_t nchannel;    /**< Number of channels (0 if unknown). */
        uint32_t nrank;       /**< Number of ranks (0 if unknown). */
    
        /**
         * current lock nest order
         *  - qlock->mlock (ring/hash/lpm)
         *  - mplock->qlock->mlock (mempool)
         * Notice:
         *  *ALWAYS* obtain qlock first if having to obtain both qlock and mlock
         */
        rte_rwlock_t mlock;   /**< only used by memzone LIB for thread-safe. */
        rte_rwlock_t qlock;   /**< used for tailq operation for thread safe. */
        rte_rwlock_t mplock;  /**< only used by mempool LIB for thread-safe. */
    
        uint32_t memzone_cnt; /**< Number of allocated memzones */
    
        /* memory segments and zones */
        struct rte_memseg memseg[RTE_MAX_MEMSEG];    /**< Physmem descriptors. */
        struct rte_memzone memzone[RTE_MAX_MEMZONE]; /**< Memzone descriptors. */
    
        struct rte_tailq_head tailq_head[RTE_MAX_TAILQ]; /**< Tailqs for objects */
    
        /* Heaps of Malloc per socket */
        struct malloc_heap malloc_heaps[RTE_MAX_NUMA_NODES];
    
        /* address of mem_config in primary process. used to map shared config into
         * exact same address the primary process maps it.
         */
        uint64_t mem_cfg_addr;
    } __attribute__((__packed__));
  • struct rte_memseg (rte_memory.h) rte_mem_config 구조 체 의 memseg 배열 은 물리 적 주 소 를 유지 하 는 것 입 니 다. 위 에서 struct hugepage 구 조 는 모든 hugepage 물리 페이지 에 프로그램 에 저 장 된 가상 저장 주 소 를 저장 합 니 다.memseg 배열 의 역할 은 물리 적 주소, 가상 주 소 를 연속 으로 하 는 hugepage 이 고 모두 같은 socket 에 있 으 며, pagesize 도 같은 hugepage 페이지 를 집합 하여 하나의 memseg 구조 에 그 어 놓 는 것 입 니 다. 이렇게 하 는 장점 은 메모리 최적화 입 니 다.이 구조 체 의 정 보 는 모두 hugepage 페이지 표 배열 에서 얻 은 것 이다
  • /**
     * Physical memory segment descriptor.
     */
    struct rte_memseg {
        phys_addr_t phys_addr;      /**< Start physical address.   memseg       hugepage       */
        union {
            void *addr;         /**< Start virtual address.  hugepage          ,               ,       phys_addr。 */
            uint64_t addr_64;   /**< Makes sure addr is always 64 bits */
        };
    #ifdef RTE_LIBRTE_IVSHMEM
        phys_addr_t ioremap_addr; /**< Real physical address inside the VM */
    #endif
        size_t len;               /**< Length of the segment. memseg      size*/
        uint64_t hugepage_sz;       /**< The pagesize of underlying memory      size 2M /1G? */
        int32_t socket_id;          /**< NUMA socket ID. */
        uint32_t nchannel;          /**< Number of channels. */
        uint32_t nrank;             /**< Number of ranks. */
    #ifdef RTE_LIBRTE_XEN_DOM0
         /**< store segment MFNs */
        uint64_t mfn[DOM0_NUM_MEMBLOCK];
    #endif
    } __rte_packed;
  • struct rte_memzone (rte memzone. h) 이 구조 체 는 DPDK 메모리 관리 가 최종 적 으로 클 라 이언 트 프로그램 에 제공 하 는 기본 인 터 페 이 스 를 통 해 rtememzone_reverse 는 dpdk hugepage 를 기반 으로 같은 물리 cpu 에 속 하 는 물리 적 메모리 연속 과 가상 메모리 도 연속 되 는 주 소 를 가 져 올 수 있 습 니 다.안에서 만족 찾기 socketid 의 요구, 최소 memseg, 그 중에서 메모리 하 나 를 그 어 낸 다음 이 메모 리 를 memzone 에 기록 합 니 다.일반적인 상황 에서 각 기능 분배 메모 리 는 이 함수 로 memzone rte 를 분배 합 니 다.ring/rte_malloc/rte_mempool 등 구성 요 소 는 모두 rte 에 의존 합 니 다.memzone 구성 요소 가 구현 되 었 습 니 다
  • /**
     * A structure describing a memzone, which is a contiguous portion of
     * physical memory identified by a name.
     */
    struct rte_memzone {
    
    #define RTE_MEMZONE_NAMESIZE 32       /**< Maximum length of memory zone name.*/
        char name[RTE_MEMZONE_NAMESIZE];  /**< Name of the memory zone. */
    
        phys_addr_t phys_addr;            /**< Start physical address. */
        union {
            void *addr;                   /**< Start virtual address. */
            uint64_t addr_64;             /**< Makes sure addr is always 64-bits */
        };
    #ifdef RTE_LIBRTE_IVSHMEM
        phys_addr_t ioremap_addr;         /**< Real physical address inside the VM */
    #endif
        size_t len;                       /**< Length of the memzone. */
    
        uint64_t hugepage_sz;             /**< The page size of underlying memory */
    
        int32_t socket_id;                /**< NUMA socket ID. */
    
        uint32_t flags;                   /**< Characteristics of this memzone. */
        uint32_t memseg_id;               /**< Memseg it belongs. */
    } __attribute__((__packed__));
  • rte_memzone_reverse () 함수: 일반적인 상황 에서 각 기능 분배 메모 리 는 이 함 수 를 사용 하여 memzone const structrte 를 분배 합 니 다.memzone * rte_memzone_reserve (constchar * name, size t len, int socket id, unsigned flags) {memzone_reserve 메모리 할당 후, 동시에 rtemem_config. memzone 배열 에 요 소 를 할당 하여 저장 합 니 다.memseg 에서 메모 리 를 분배 하고 memzone 단위 로 분배 합 니 다. 모든 분배 상황 은 memzone 그룹 에 기록 되 어 있 습 니 다. 물론 이 그룹 은 다 중 프로 세 스 공유 입 니 다. 모두 가 볼 수 있 습 니 다.rtemem_config 구조 내 memzoneidx 변 수 는 현재 분 배 된 memzone 을 기록 합 니 다. 이 변 수 를 신청 할 때마다 + 1
  • 좋은 웹페이지 즐겨찾기