Chinaunix首页 | 论坛 | 博客
  • 博客访问: 162486
  • 博文数量: 15
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 193
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-12 17:44
文章分类

全部博文(15)

文章存档

2009年(5)

2008年(10)

我的朋友

分类: LINUX

2008-12-26 11:44:44

 
Linux内核中的Cache段
NeilWong ()

    最近移植LEON3的内核时,了解了一些简单知识,特提出来供大家分享.

    我们知道Linux 内核包含很多Section段,例如主要的.text段,.data段等等.但另外还有一种段,其可以在内核加载时自动存放到相应平台的Cache中,以方便被快速读取,该Section的名称为以下两种:

   .data.cacheline_aligned
   .data.read_mostly

   其中.data.read_mostly是在比较新的内核中才出现的,

   例如在Linux-2.6.11/fs/bio.c中的bvec_array是这样定义的:

#define BV(x) { .nr_vecs = x, .name = "biovec-"__stringify(x) }
static struct biovec_pool bvec_array[BIOVEC_NR_POOLS] = {
        BV(1), BV(4), BV(16), BV(64), BV(128), BV(BIO_MAX_PAGES),
};
#undef BV

    而在Linux-2.6.21或更高版本中,该定义已经增加了 __read_mostly短语  

#define BV(x) { .nr_vecs = x, .name = "biovec-"__stringify(x) }
static struct biovec_slab bvec_slabs[BIOVEC_NR_POOLS] __read_mostly = {
 BV(1), BV(4), BV(16), BV(64), BV(128), BV(BIO_MAX_PAGES),
};
#undef BV

   __read_mostly原语将定义为存放在.data.read_mostly段中

  include/asm/cache.h

#define __read_mostly __attribute__((__section__(".data.read_mostly")))

    由此可见,我们可以将经常需要被读取的数据定义为 __read_mostly类型, 这样Linux内核被加载时,该数据将自动被存放到Cache中,以提高整个系统的执行效率.

   另一方面,如果所在的平台没有Cache,或者虽然有Cache,但并不提供存放数据的接口,(也就是并不允许人工放置数据在Cache中), 这样定义为 __read_mostly类型的数据将不能存放在Linux内核中,甚至也不能够被加载到系统内存去执行,将造成Linux 内核启动失败.

   解决的方法有两种:

   修改include/asm/cache.h中的__ready_mostly定义为:

   #define __read_mostly

   或者修改arch/xxx/kernel/vmlinux.S

   修改.data.read_mostly段的位置到实际内存空间中去,例如放置在 .data段之后等等

阅读(1536) | 评论(2) | 转发(0) |
0

上一篇:CoolIRIS

下一篇:Fedora Core 5 编译Android

给主人留下些什么吧!~~

NeilWong2010-09-03 15:53:21

如果不加这样的前缀,不就和普通的段一样吗? 其自动加载到内存中呀.

unbutun2010-08-24 20:25:42

请问把它放到内存中去,该如何修改?