博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux2.6内核--内存管理(1)--分页机制
阅读量:4310 次
发布时间:2019-06-06

本文共 906 字,大约阅读时间需要 3 分钟。

      在内核里分配内存可不像在其他地方分配内存那么容易。造成这种局面的因素很多。从根本上讲,是因为内核本身不能像用户空间那样奢侈的使用内存。内核与用户空间不同,它不具备这种能力,它不支持简单便捷的内存分配方式。比如,内核一般不能睡眠。此外,处理内存分配错误对于内核来说也绝非是一件简单的事。正式由于这些限制,再加上内存分配机制不能太复杂,所以在内核中获取内存要比在用户空间复杂的多。

      首先,我们讨论下内核中的分页机制。

      内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻址单位通常是字,但是,内存管理单元通常以页为单位进行处理。从虚拟内存的角度看,页就是最小的基本单位。所以,在内核看来,物理内存就像下面这样:

     注意:基本上内核的分页都是固定大小的页。

 

     内核用 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:这个根据名字就可以看得出,它指向私有数据。

 

 

转载于:https://www.cnblogs.com/james1207/p/3275739.html

你可能感兴趣的文章
JavaScript表单验证
查看>>
Vijos p1123 均分纸牌
查看>>
关于NSDateFormatter的格式-dd是月天,DD是年天
查看>>
各路传奇排序
查看>>
像心跳的方向走
查看>>
收集JavaScript中常用的方法函数
查看>>
2. cgi 结构目录
查看>>
Abp框架下 Area中新建Layout报错的问题
查看>>
linux下修改hosts文件
查看>>
Restful API 设计参考原则
查看>>
两个实用的Python的装饰器
查看>>
将前端所要传的参数设置在一个对象中,将对象转换成字符串往后台传
查看>>
BOM
查看>>
9、连接查询A
查看>>
钽电容封装大全及技术参数
查看>>
linux线程同步浅析
查看>>
UNIX环境高级编程——信号(API)
查看>>
SVG
查看>>
selenium-ide-2.3.0 组件在foxfire45.0无法安装的问题
查看>>
C#中get和set
查看>>