你好,游客 登录 注册 搜索
背景:
阅读新闻

ARM Linux基本数据类型综合应用实例

[日期:2011-04-07] 来源:Linux社区  作者:huang879135 [字体: ]

2、内核物理页结构

内核的物理页结构定义在<linux/mm.h>中,它是一个构造数据类型—结构体,其结构体定义如下:

struct page{

        /*页状态标记*/

        page_flags_t flages;

        /*页引用标记*/

        atomic_t _count;

         /*页映射计数,并且限制页反向映射*/

        atomic_t _mapcount;

        /*私有页标记*/

        unsigned long private;

        /*指向该物理页相关的结构*/

        struct_address_space *mapping;

        /*页映射偏移*/

        pgoff_t index;

        /*页换出队列*/

        struct list_head lru;

       /*页虚拟地址*/

        void *virtual;

};

下面从语法角度介绍这些基本数据类型中的重要参数。

(1)flags

flags域是用于存放页的状态的,它的类型标识符为“page_flags_t”,可以看出,这是一个自定义的标识符,通常是由typedef来定义的。读者可以继续在该文件中查找,可以发现有以下定义:

typedf unsighed long page_flags_t;

可以看到,“page_flags_t"实际上是一个“unsigned long ”型32位的数据类型。那么,为什么在此处要设置一个32位的数据类型呢?原因在于,flag是用于页得状态的,它其中的每一位都单独表示一种状态,所以它可以同时表示出32种不同的状态。这些状态标志定义在<linux/page_flags.h>中,如下所示:

#define PG_locked   0       /*页被锁*/

#define PG_error  1          /*页错误*/

#define PG_referenced   2    /*页被引用*/

#define PG_uptodate   3      /*页被更新*/

#define PG_dirty   4       /*页是脏的*/

#define PG_lru   5       /*页换出*/

#define PG_active   6     /*页激活*/

#define PG_slab   7      /*页缓存*/

#define PG_arch  8     /*页被检查*/

#define PG_reserved  10      /*页保留*/

#define PG_arch_1  9     /*一级页*/

#define PG_private  11      /*私有页*/

#define PG_writeback   12       /*页写回*/

#define PG_nosave  13      /*该页不安全*/

#define PG_compound   14      /*页响应*/

#define PG_swapcache   15      /*页换出在高速缓存中*/

#define PG_mappedtodisk   16       /*在磁盘中有该快*/

#define PG_reclaim   17      /*页声明*/

#define PG_nosave_free   18      /*页空闲*/

#define PG_uncached  19      /*页未在cache中命中*/

这里定义了19个状态,因此,安排一个32位的整数可以给今后的升级留有空间。

(2)_count和_mapcount

_count和_mapcount分别是页引用计数和页映射计数,它们的类型都是“atomic_t",同“atomic_t”,同“page_flags_t”一样,这个类型标识符也是自定义的,定义其的文件在</include/asm-arm/atomic.h>中,如下所示:

typedef struct {volatile int counter;}atomic_t;

可以看到,typedef不仅可以为基本数据类型取新名,也可以为构造数据类型取名。

(3)virtual

virtual是一个空指针,它用于指明页的虚拟地址。可以看到,使用指针来表示地址是非常恰当的。有些情况下,一些内存(即所谓的高端内存)并不永远地映射到内核空间上,这是virtual的值为NULL。

在这时为什么要用空指针呢?由于在此处,virtual用于表明一个地址而不是用于指示任何其他类型的数据,所以是使用空指针这一中立类型的指针是最合适的。

linux
相关资讯       Arm Linux 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款