zoukankan      html  css  js  c++  java
  • Linux内核中的Cache段

    Linux内核中的Cache段 

    原文地址:http://blogold.chinaunix.net/u2/85263/showart_1743693.html

        最近移植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段之后等等

  • 相关阅读:
    在Vue构建的SPA网页里 刷新的话,显示404页面
    springboot2.x 设置404页面
    关于Typora不显示PicGo.app的问题
    DBeaver中table插入新的数据
    DBeaver修改table的column名字
    Zeal
    Android Studio 快速创建 Toast
    使用VSCode调试单个JavaScript文件
    使用maven打包普通的java项目
    在命令行界面实现彩色字符输出 -- 并且介绍和这个相关的比较好用的java类库
  • 原文地址:https://www.cnblogs.com/zxc2man/p/4468362.html
Copyright © 2011-2022 走看看