• build_mem_type_table


    1.函数调用关系

    start_kernel
        -->setup_arch
            -->paging_init
                -->build_mem_type_table

    2.全局变量

    在arch/arm/mm/mmu.c中定义以下全局变量

    2.1 int cachepolicy

    static unsigned int cachepolicy __initdata = CPOLICY_WRITEBACK;

    指定缓冲策略,可选值如下宏定义

    #define CPOLICY_UNCACHED    0
    #define CPOLICY_BUFFERED    1
    #define CPOLICY_WRITETHROUGH    2
    #define CPOLICY_WRITEBACK    3
    #define CPOLICY_WRITEALLOC    4

    2.2 struct cachepolicy cache_policies[]

    static struct cachepolicy cache_policies[] __initdata = {
        {
            .policy        = "uncached",
            .cr_mask    = CR_W|CR_C,
            .pmd        = PMD_SECT_UNCACHED,
            .pte        = L_PTE_MT_UNCACHED,
        }, {
            .policy        = "buffered",
            .cr_mask    = CR_C,
            .pmd        = PMD_SECT_BUFFERED,
            .pte        = L_PTE_MT_BUFFERABLE,
        }, {
            .policy        = "writethrough",
            .cr_mask    = 0,
            .pmd        = PMD_SECT_WT,
            .pte        = L_PTE_MT_WRITETHROUGH,
        }, {
            .policy        = "writeback",
            .cr_mask    = 0,
            .pmd        = PMD_SECT_WB,
            .pte        = L_PTE_MT_WRITEBACK,
        }, {
            .policy        = "writealloc",
            .cr_mask    = 0,
            .pmd        = PMD_SECT_WBWA,
            .pte        = L_PTE_MT_WRITEALLOC,
        }
    };

     2.3 struct mem_type mem_types[]

    struct mem_type {
        unsigned int prot_pte;
        unsigned int prot_l1;
        unsigned int prot_sect;
        unsigned int domain;
    };
    static struct mem_type mem_types[] = {
        [MT_DEVICE] = {          /* Strongly ordered / ARMv6 shared device */
            .prot_pte    = PROT_PTE_DEVICE | L_PTE_MT_DEV_SHARED |
                      L_PTE_SHARED,
            .prot_l1    = PMD_TYPE_TABLE,
            .prot_sect    = PROT_SECT_DEVICE | PMD_SECT_S,
            .domain        = DOMAIN_IO,
        },
        [MT_DEVICE_NONSHARED] = { /* ARMv6 non-shared device */
            .prot_pte    = PROT_PTE_DEVICE | L_PTE_MT_DEV_NONSHARED,
            .prot_l1    = PMD_TYPE_TABLE,
            .prot_sect    = PROT_SECT_DEVICE,
            .domain        = DOMAIN_IO,
        },
        [MT_DEVICE_CACHED] = {      /* ioremap_cached */
            .prot_pte    = PROT_PTE_DEVICE | L_PTE_MT_DEV_CACHED,
            .prot_l1    = PMD_TYPE_TABLE,
            .prot_sect    = PROT_SECT_DEVICE | PMD_SECT_WB,
            .domain        = DOMAIN_IO,
        },    
        [MT_DEVICE_WC] = {    /* ioremap_wc */
            .prot_pte    = PROT_PTE_DEVICE | L_PTE_MT_DEV_WC,
            .prot_l1    = PMD_TYPE_TABLE,
            .prot_sect    = PROT_SECT_DEVICE,
            .domain        = DOMAIN_IO,
        },
        [MT_UNCACHED] = {
            .prot_pte    = PROT_PTE_DEVICE,
            .prot_l1    = PMD_TYPE_TABLE,
            .prot_sect    = PMD_TYPE_SECT | PMD_SECT_XN,
            .domain        = DOMAIN_IO,
        },
        [MT_CACHECLEAN] = {
            .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN,
            .domain    = DOMAIN_KERNEL,
        },
        [MT_MINICLEAN] = {
            .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_MINICACHE,
            .domain    = DOMAIN_KERNEL,
        },
        [MT_LOW_VECTORS] = {
            .prot_pte  = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
                    L_PTE_EXEC,
            .prot_l1   = PMD_TYPE_TABLE,
            .domain    = DOMAIN_USER,
        },
        [MT_HIGH_VECTORS] = {
            .prot_pte  = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
                    L_PTE_USER | L_PTE_EXEC,
            .prot_l1   = PMD_TYPE_TABLE,
            .domain    = DOMAIN_USER,
        },
        [MT_MEMORY] = {
            .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
            .domain    = DOMAIN_KERNEL,
        },
        [MT_ROM] = {
            .prot_sect = PMD_TYPE_SECT,
            .domain    = DOMAIN_KERNEL,
        },
        [MT_MEMORY_NONCACHED] = {
            .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
            .domain    = DOMAIN_KERNEL,
        },
    };
  • 相关阅读:
    第三章 传奇的开始--Delphi(附读书笔记)
    南沙才是根本,进军西太平洋就是一个伪命题
    Qt之自定义插件(for Qt Designer)
    人类本来就是在无奈中前进的
    亚投行国家分工非常明确,一路一带是欧亚大融合之路,欢呼吧!
    冒泡排序
    webkit中DOM 事件有多少
    在TMemo上画一条线(超级简单,举一反三)
    判断系统64位(使用GetNativeSystemInfo函数,XP时代就有这个函数了)
    项目的大小衡量标准,以及项目演进的方法(填空架子,持续集成,边开发边测试效果)
  • 原文地址:https://www.cnblogs.com/yangjiguang/p/8157129.html
Copyright © 2020-2023  润新知