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成员函数:通过缺页异常来建立新页表。
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成员函数:通过缺页异常来建立新页表。
相关文章推荐
- 内存管理概述、内存分配与释放、地址映射机制
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 内存储器管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- Java数组概述、定义格式说明、初始化、内存分配及常见操作
- 基础回顾——Java对象创建、内存分配、访问定位概述
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 内存管理概述、内存分配与释放、地址映射机制
- 进程概述和内存分配
- jvm虚拟机内部原理之概述和内存分配
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- Jvm内存分配概述与相关配置详解
- 数组的概述,内存分配,两种数据类型的对比
- Windows下动态内存分配方式
- Java内存分配原理解析
- #POJ 3667 Hotel 【多重线段树、内存分配问题】
- 操作系统 内存分配与回收算法 模拟
- C语言内存分配相关练习
- Java内存分配、管理小结
- C++中内存分配详解