Linux2.6内核--内存管理(1)--分页机制
来源:互联网 发布:知乎炸鱼 编辑:程序博客网 时间:2024/04/26 07:02
在内核里分配内存可不像在其他地方分配内存那么容易。造成这种局面的因素很多。从根本上讲,是因为内核本身不能像用户空间那样奢侈的使用内存。内核与用户空间不同,它不具备这种能力,它不支持简单便捷的内存分配方式。比如,内核一般不能睡眠。此外,处理内存分配错误对于内核来说也绝非是一件简单的事。正式由于这些限制,再加上内存分配机制不能太复杂,所以在内核中获取内存要比在用户空间复杂的多。
首先,我们讨论下内核中的分页机制。
内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻址单位通常是字,但是,内存管理单元通常以页为单位进行处理。从虚拟内存的角度看,页就是最小的基本单位。所以,在内核看来,物理内存就像下面这样:
注意:基本上内核的分页都是固定大小的页。
内核用 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)--分页机制
- Linux2.6内核--内存管理(1)--分页机制
- Linux2.6内核--内存管理(2)--区
- Linux2.6内核--内存管理(2)--区
- Linux内核源码分析--内存管理(一、分页机制)
- Linux内核源码分析--内存管理(一、分页机制)
- Linux2.6.32内核笔记(2)内存管理子系统
- 【内存管理】分页机制
- Linux2.6物理内存管理
- linux2.4到linux2.6内核调度(1)
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- 谁在使用我的网站——用户忠诚和价值分析
- Tab控制器 ( UITabBarController )
- 数据库相关
- JDK环境变量设置详解
- Eclipse中调用VS 2012生成的DLL文件,进行调试的步骤。。。[含VS2012中release版本的调试配置]
- Linux2.6内核--内存管理(1)--分页机制
- shell字符串操作之cut---实现字符串截取
- cocos2d-x锚点问题
- android 编译系统文件结构
- http协议详解
- web界面使用bootstrap布局混乱
- CS架构客户端软件升级方案
- 计算代码行数
- GCC