您的位置:首页 > 运维架构 > Linux

linux kernel 内存分配概述

2011-02-11 17:46 197 查看
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成员函数:通过缺页异常来建立新页表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: