• 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,
        },
    };
  • 相关阅读:
    Tarjan-割点&桥&双连通
    树状数组
    loli的搜索测试-5
    思维题
    生成树
    贪心
    loli的搜索测试-4
    树链剖分
    基于AHK的上课自动签到
    用列表实现栈
  • 原文地址:https://www.cnblogs.com/yangjiguang/p/8157129.html
Copyright © 2020-2023  润新知