Linux内核学习----内存管理

本文深入探讨Linux内核的内存管理,包括页和区的概念,页的结构和管理,如何获取和释放页,以及kmalloc和vmalloc两种内存分配函数的使用。此外,还介绍了slab缓存层的作用和设计,以及内核栈的静态分配策略。
摘要由CSDN通过智能技术生成


一般的内存分配分为内核空间和用户空间,二者之间有很大的不同,内核中不支持简单便捷的内存分配(内核一般不能睡眠),内核中处理内存分配错误相对困难。

内核把物理页作为内存管理的基本单元。即MMU(内存管理单元)通常以页为单位进行处理,管理系统中的页表。从虚拟内存的角度页就是最小单位。
处理器的最小可寻址单位通常为字节。
不同的体系结构中支持的页大小是不同的,其中主要的是32位体系和64位体系,前者支持4kb的页,后者支持8kb的页。

内核中使用page表示系统中的每个物理页
struct page{
	unsigned long  				flags;
	atomic_t					_count;
	atomic_t 					_mapcount;
	unsigned long				provate;
	struct address_space  		*mapping;
	pgoff_t						index;
	struct list_head  			lru;
	void 						*virtual;
}

结构体中字段的含义:

  1. flag用来存放页的状态,状态有(是否是脏的,是否被锁定再内存中),flag的每一位单独表示一种状态,至少可以同时表示出32种不同的状态;
  2. _count存放页的引用计数----即这一页被引用了多少次,-1表示当前内核没有引用这一页即再新的分配中可用,其中内核是调用page_count()进行检查唯一的参数是page结构体,该函数返回值为0就表示页空闲,正整数表示再使用;
  3. mapping:表示当前页作为页缓存使用(mapping域指向和这个页关联的address——space对象);
  4. private:表示当前页作为私有数据使用(由private指向);
  5. 作为进程页表中的映射;
  6. virtual域是页的虚拟地址(即页在虚拟内存中的地址),有些内存(高端内存)并不永久的映射到内核地址空间,这是这个值为null,使用时必须动态映射;
  7. 由于page描述的是物理页相关,因此page中的数据由于交换等原因,数据可能并不再和同一个jpage结构相关联。主要是因为page是为了描述物理内存本身而不是其中的数据。

内核通过这个结构管理所有的页,内核需要知道这个页的状态和拥有者。
拥有者:用户空间进程、动态分配的内核数据、静态内核代码、页高速缓存
系统中所有的page结构体所占的大小:每一个占40字节,如果是系统的物理页大小是8kb,物理内存是4gb,所有的占的空间为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值