Linux2.6内核--内存管理(1)--分页机制
在内核里分配内存可不像在其他地方分配内存那么容易。造成这种局面的因素很多。从根本上讲,是因为内核本身不能像用户空间那样奢侈的使用内存。内核与用户空间不同,它不具备这种能力,它不支持简单便捷的内存分配方式。比如,内核一般不能睡眠。此外,处理内存分配错误对于内核来说也绝非是一件简单的事。正式由于这些限制,再加上内存分配机制不能太复杂,所以在内核中获取内存要比在用户空间复杂的多。
首先,我们讨论下内核中的分页机制。
内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻址单位通常是字,但是,内存管理单元通常以页为单位进行处理。从虚拟内存的角度看,页就是最小的基本单位。所以,在内核看来,物理内存就像下面这样:
注意:基本上内核的分页都是固定大小的页。
内核用 struct page 结构表示系统中的每个物理页,这个结构就好像下面这样:
struct page
{
unsigned long flags;
atomic_t _count;
atomic_t _mapcount;
unsigned long private;
struct address_space *mapping;
pgoff_t index;
struct list_head lru;
void *virtual;
}
下面,我们来解释下其中的重要字段。
flags:这个字段用于存放页的状态。这些状态包括页是不是脏的,是不是被锁定在内存中等。 flag 的每一位单独表示一种状态,所以,它至少可以同时表示出32种不同的状态。
_count:这个字段存放页的使用计数,也就是这个页被引用了多少次。很奇怪,技术值变为 -1 时,就说明当前内核并没有引用这一页,于是,在新的分配中就可以使用它,注意,这个字段使用的是 -1 代表未使用,而不是 0 。
virtual:这个字段是页的虚拟地址。
mapping:这个域指向和这个页关联的 address_space 对象。
private:这个根据名字就可以看得出,它指向私有数据。
Linux2.6内核--内存管理(1)--分页机制相关推荐
- Linux内存管理:分页机制
<Linux内存管理:内存描述之内存节点node> <Linux内存管理:内存描述之内存区域zone> <Linux内存管理:内存描述之内存页面page> < ...
- 【Linux 内核 内存管理】RCU 机制 ② ( RCU 机制适用场景 | RCU 机制特点 | 使用 RCU 机制保护链表 )
文章目录 一.RCU 机制适用场景 二.RCU 机制特点 三.使用 RCU 机制保护链表 一.RCU 机制适用场景 在上一篇博客 [Linux 内核 内存管理]RCU 机制 ① ( RCU 机制简介 ...
- Linux2.6内核--内存管理(2)--区
由于硬件的限制,内核不能对所有的页一视同仁.有些页位于内存中的特定物理地址上,所以,不能将其用于一些特别的任务.(关于内存分页机制可以查看:http://blog.csdn.net/dlutbruce ...
- 【Linux 内核 内存管理】RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )
文章目录 一.RCU 机制 二.RCU 机制的优势与弊端 三.RCU 机制的链表应用场景 一.RCU 机制 RCU , 英文全称是 " Read-Copy-Update " , 对 ...
- 【Linux 内核 内存管理】RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )
文章目录 一.RCU 模式下更新链表项 list_replace_rcu 函数 二.链表操作时使用 smp_wmb() 函数保证代码执行顺序 一.RCU 模式下更新链表项 list_replace_r ...
- 【Linux 内核 内存管理】RCU 机制 ③ ( RCU 模式下添加链表项 list_add_rcu 函数 | RCU 模式下删除链表项 list_del_rcu 函数 )
文章目录 一.RCU 模式下添加链表项 list_add_rcu 函数 二.RCU 模式下删除链表项 list_del_rcu 函数 一.RCU 模式下添加链表项 list_add_rcu 函数 在 ...
- ARM和英特尔的386系列内存管理MMU硬件机制不同,ARM是基于协处理CP15(核心是C2 TTRB0,1)分页式,386是以段寄存器和CR3寄存器分段分页式内存管理
ARM和英特尔的386系列内存管理MMU硬件机制不同,ARM是基于协处理CP15(核心是C2 TTRB0,1)分页式,386是以段寄存器和CR3寄存器分段分页式内存管理
- pae扩展内存 linux,浅析linux内核内存管理之PAE
浅析linux内核内存管理之PAE 早期Intel处理器从80386到Pentium使用32位物理地址,理论上,这样可以访问4GB的RAM.然而,大型服务器需要大于4GB的RAM来同时运行数以千计的进 ...
- Linux内核内存管理(3):kmemcheck介绍
Linux内核内存管理 kmemcheck介绍 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 5.10.13不存在kmemcheck的概念,取代的是k ...
最新文章
- 从科学简历看研究方法——爱因斯坦探索性的演绎法
- easyui datagrid 多行删除问题
- python的代码有哪些_简单python代码类型有哪些?
- java计算器布局设计_Java图形化界面设计——布局管理器之GridLayout(网格布局) 之计算器...
- Lync通过IP地址网段显示地理位置
- 机器学习——正则化-L2
- 使用 Source Generator 自动生成 WEB API
- NYOJ_37_回文字符串
- EF(Entity FrameWork)实体框架
- spring和jdbctemplate
- asp.net身份认证
- Matlab遗传算法工具箱(gaot)下载及安装
- 千寻位置_SDK集成_Linux快速上手指南
- html5 3d 图片动画制作软件,9款令人惊叹的HTML5 3D动画应用
- springboot 当前无法使用此页面(无法打开页面)
- 第130章 SQL函数 SQRT
- yolov7 打开深度摄像头 realsences
- Windows远程桌面卡顿问题(包含网络调优)
- 网线、WiFi、路由器的介绍选择
- 风险投资(VC)与私募股权投资(PE)的区别