linux kernel 内存分配概述

    技术2025-04-09  27

    linux kernel支持虚拟内存管理机制,通过页表机制实现对物理内存、内核逻辑内存和内核虚拟内存的管理。

     

    linux kernel通过struct page结构来管理系统中的物理内存。kernel维护了一个或多个page结构数组,用来跟踪系统中的物理内存。在一些系统中,有一个单独的数组称之为mem_map。

     

    kernel所能直接进行读写操作的内存只能是广义的内核虚拟内存(包括内核逻辑内存)。

     

    常用的kernel内存处理函数为:

    void *kmap(struct page *page)

    void kunmap(struct page *page)

    该对函数用于将物理页框地址转换为内核虚拟地址。对于低端地址直接返回内核逻辑地址,对于高端内存,创建页表。

     

    void *kmalloc(size_t size, gfp_t flags)

    void kfree(const void *x)

    该对函数用于分配和释放内核逻辑地址,其在物理地址上是连续的。

     

    unsigned long get_zeroed_page(gfp_t gfp_mask)

    __get_free_page(gfp_t gfp_mask)

    unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)

    free_page(unsigned long addr)

    void free_pages(unsigned long addr, unsigned int order)

    该组函数用于分配和释放较大的内核逻辑地址,其在物理地址上是连续的。

     

    void *vmalloc(unsigned long size)

    void vfree(const void *addr)

    该对函数用于分配和释放内核虚拟地址,其在物理地址上可能不连续,同时需要建立页表。

     

    static inline void __iomem *ioremap(resource_size_t offset, unsigned long size)

    void iounmap(volatile void __iomem *addr)

    该对函数用于为物理地址建立或注销页表,将物理地址转换为内核虚拟地址。

    例如pci device driver访问相应外设时,首先需要调用request_region簇函数获取使用权限然后调用ioremap将物理地址转换为内核虚拟地址后,才能进行访问。

     

    系统调用mmap用于实现内存映射,将内核空间地址与用户空间地址对应起来。其可通过两种方式实现:

    remap_page_range函数:一次性的构造用于映射一段物理地址的新页表,实现了内核空间与用户空间的映射。

    struct vm_ops中nopage成员函数:通过缺页异常来建立新页表。

     

    最新回复(0)