现在的位置: 首页 > 综合 > 正文

linux kernel 内存分配概述

2013年11月08日 ⁄ 综合 ⁄ 共 1118字 ⁄ 字号 评论关闭

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成员函数:通过缺页异常来建立新页表。

 

抱歉!评论已关闭.