内存子系统1_分配接口

简介:
1.页
	<linux/mm_types.h>
  	struct page;
	内核把物理页作为内存管理的基本单位;内存管理单元(MMU)把虚拟地址转换为物理地址,
通常以页为单位进行处理。MMU以页大小为单位来管理系统中的也表。

  	内核struct page管理系统中所有的页.
2.区
	<linux/mmzone.h>
  	struct zone;
  	Linux将内核空间地址划分为三个区:ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。
  	在x86结构中,三种类型的区域如下:
  	ZONE_DMA        	0-16MB
  	ZONE_NORMAL       	16MB-896MB
  	ZONE_HIGHMEM       	896MB - tail
3.页操作
	static inline struct page *alloc_pages(gfp_t gfp_mask, unsigned int order)
	分配2**order个连续的物理页,返回指向第一个页的page结构体指针,max(order)=11,12
 
	void *page_address(const struct page *page)
	返回指向给定物理页当前所在的逻辑地址

	extern unsigned long get_zeroed_page(gfp_t gfp_mask);
	extern void free_pages(unsigned long addr, unsigned int order);
 
4.内存操作
	kmalloc分配以字节为单位的一块内核内存,分配的内存物理上连续:
	void *kmalloc(size_t size, gfp_t flags)
	void kfree(const void *addr)
	
	vmalloc分配的内存虚拟地址是连续的,而物理地址则无需连续:
	void *vmalloc(unsigned long size)
	void vfree(const void *addr)
 
5.slab层
	Linux内核提供了slab来管理频繁分配释放的内存:
	slab创建高速缓存组,每个高速缓存被划分不同状态的slab,slab由一个或多个物理上连续的页组成。
	每个slab处于三种状态之一:满,部分满,空。
	
	高速缓存,slab,对象之间的关系:

                                                          


slab数据结构和接口:
	每个高速缓存用kmem_cache结构来表示:
       	struct kmem_cache {
              struct kmem_list3 **nodelists;
      	}
	缓存区包含三种slab:满,未满,空闲
	struct kmem_list3 {
       		struct list_head slabs_partial; /* partial list first, better asm code */
       		struct list_head slabs_full;
       		struct list_head slabs_free;
	};
	每一个slab包含多个对象:
	struct slab {
              struct list_head list;
              unsigned long colouroff;
              void *s_mem;            /* including colour offset */
              unsigned int inuse;     /* num of objs active in slab */
              kmem_bufctl_t free;
              unsigned short nodeid;
	};
 
6.slab操作
	kmem_cache_create用来创建一个新缓存:
	struct kmem_cache *kmem_cache_create (const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void *))
	flags 参数指定了为缓存启用的选项:
	SLAB_RED_ZONE		:在对象头、尾插入标志,用来支持对缓冲区溢出的检查。
  	SLAB_POISON		:使用一种己知模式填充slab,允许对缓存中的对象进行监视(对象属对象所有,不过可以在外部进行修改)。
  	SLAB_HWCACHE_ALIGN	:指定缓存对象必须与硬件缓存行对齐。
 
	kmem_cache_alloc从缓存中返回一个对象:
	void kmem_cache_alloc( struct kmem_cache *cachep, gfp_t flags );
	如果缓存目前为空,那么这个函数就会调用 cache_alloc_refill 向缓存中增加内存。

	
7.高端内存的映射
	kmap永久映射,可能阻塞,映射一个给定的page结构到内核地址空间
  	void *kmap(struct page *page)
  	void kunmap(struct page *page)
 
	临时映射:不会阻塞     
	void *kmap_atomic(struct page *page)
 


目录
相关文章
|
5月前
|
XML Ubuntu Linux
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
|
21天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
81 12
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
73 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
58 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
4月前
|
关系型数据库 MySQL
MySQl优化:使用 jemalloc 分配内存
MySQl优化:使用 jemalloc 分配内存
|
4月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
5月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
136 8
|
5月前
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
5月前
|
Java 运维
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
24 1
|
5月前
|
Java Windows
Java演进问题之JVM在内存返还策略上会左右为难如何解决
Java演进问题之JVM在内存返还策略上会左右为难如何解决

热门文章

最新文章