免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1391 | 回复: 4
打印 上一主题 下一主题

[内存管理] linux一级二级寻址 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-19 03:37 |只看该作者 |倒序浏览
大家好:
    第一次来这个论坛,希望大家帮助。
    我的问题是这样的:
    head.S中建立了临时页表,是平坦方式的,而后在void __init create_mapping(struct map_desc *md)中建立页表。
    我板子是
    0x8000 0000 - 0x8440 0000 为第一段mem bank
    0x8800 0000 - 0x9000 0000 为第二段mem bank

    我的疑问是这样的,linux运行的时候,自身的代码段 数据段 以及堆栈是采用二级页表寻址还是一级段式页表寻址?整个被管理的物理内存都是通过段式映射,而没有采用pte二级页表的方式映射。那么我们平时谈论的二级页表方式转化地址到底用在什么情况下?

    谢谢。

    static void __init alloc_init_section(pgd_t *pgd, unsigned long addr,
                                      unsigned long end, unsigned long phys,
                                      const struct mem_type *type)
    {
        pmd_t *pmd = pmd_offset(pgd, addr);

        /*
         * Try a section mapping - end, addr and phys must all be aligned
         * to a section boundary.  Note that PMDs refer to the individual
         * L1 entries, whereas PGDs refer to a group of L1 entries making
         * up one logical pointer to an L2 table.
         */
        if (((addr | end | phys) & ~SECTION_MASK) == 0) {
                pmd_t *p = pmd;

                if (addr & SECTION_SIZE)
                        pmd++;

                do {
                        *pmd = __pmd(phys | type->prot_sect);
                        phys += SECTION_SIZE;
                } while (pmd++, addr += SECTION_SIZE, addr != end);

                flush_pmd_entry(p);
        } else {
                /*
                 * No need to loop; pte's aren't interested in the
                 * individual L1 entries.
                 */
                alloc_init_pte(pmd, addr, end, __phys_to_pfn(phys), type);
        }
    }

    static void __init alloc_init_section(pgd_t *pgd, unsigned long addr,
                                      unsigned long end, unsigned long phys,
                                      const struct mem_type *type)
    {
        pmd_t *pmd = pmd_offset(pgd, addr);

        /*
         * Try a section mapping - end, addr and phys must all be aligned
         * to a section boundary.  Note that PMDs refer to the individual
         * L1 entries, whereas PGDs refer to a group of L1 entries making
         * up one logical pointer to an L2 table.
         */
        if (((addr | end | phys) & ~SECTION_MASK) == 0) {
                printk(“secions  phy %X addr %X \n”,addr,phys);
                pmd_t *p = pmd;

                if (addr & SECTION_SIZE)
                        pmd++;

                do {
                        *pmd = __pmd(phys | type->prot_sect);
                        phys += SECTION_SIZE;
                } while (pmd++, addr += SECTION_SIZE, addr != end);

                flush_pmd_entry(p);
        } else {
                printk(“ L2 phy %X addr %X \n”,addr,phys);
                /*
                 * No need to loop; pte's aren't interested in the
                 * individual L1 entries.
                 */
                alloc_init_pte(pmd, addr, end, __phys_to_pfn(phys), type);
        }
    }

打印效果如下:
section addr C0000000 phys 80000000
section addr C0200000 phys 80200000
section addr C0400000 phys 80400000
section addr C0600000 phys 80600000
section addr C0800000 phys 80800000
section addr C0A00000 phys 80A00000
section addr C0C00000 phys 80C00000
section addr C0E00000 phys 80E00000
section addr C1000000 phys 81000000
section addr C1200000 phys 81200000
section addr C1400000 phys 81400000
section addr C1600000 phys 81600000
section addr C1800000 phys 81800000
section addr C1A00000 phys 81A00000
section addr C1C00000 phys 81C00000
section addr C1E00000 phys 81E00000
section addr C2000000 phys 82000000
section addr C2200000 phys 82200000
section addr C2400000 phys 82400000
section addr C2600000 phys 82600000
section addr C2800000 phys 82800000
section addr C2A00000 phys 82A00000
section addr C2C00000 phys 82C00000
section addr C2E00000 phys 82E00000
section addr C3000000 phys 83000000
section addr C3200000 phys 83200000
section addr C3400000 phys 83400000
section addr C3600000 phys 83600000
section addr C3800000 phys 83800000
section addr C3A00000 phys 83A00000
section addr C3C00000 phys 83C00000
section addr C3E00000 phys 83E00000
section addr C4000000 phys 84000000
section addr C4200000 phys 84200000
section addr C8000000 phys 88000000
section addr C8200000 phys 88200000
section addr C8400000 phys 88400000
section addr C8600000 phys 88600000
section addr C8800000 phys 88800000
section addr C8A00000 phys 88A00000
section addr C8C00000 phys 88C00000
section addr C8E00000 phys 88E00000
section addr C9000000 phys 89000000
section addr C9200000 phys 89200000
section addr C9400000 phys 89400000
section addr C9600000 phys 89600000
section addr C9800000 phys 89800000
section addr C9A00000 phys 89A00000
section addr C9C00000 phys 89C00000
section addr C9E00000 phys 89E00000
section addr CA000000 phys 8A000000
section addr CA200000 phys 8A200000
section addr CA400000 phys 8A400000
section addr CA600000 phys 8A600000
section addr CA800000 phys 8A800000
section addr CAA00000 phys 8AA00000
section addr CAC00000 phys 8AC00000
section addr CAE00000 phys 8AE00000
section addr CB000000 phys 8B000000
section addr CB200000 phys 8B200000
section addr CB400000 phys 8B400000
section addr CB600000 phys 8B600000
section addr CB800000 phys 8B800000
section addr CBA00000 phys 8BA00000
section addr CBC00000 phys 8BC00000
section addr CBE00000 phys 8BE00000
section addr CC000000 phys 8C000000
section addr CC200000 phys 8C200000
section addr CC400000 phys 8C400000
section addr CC600000 phys 8C600000
section addr CC800000 phys 8C800000
section addr CCA00000 phys 8CA00000
section addr CCC00000 phys 8CC00000
section addr CCE00000 phys 8CE00000
section addr CD000000 phys 8D000000
section addr CD200000 phys 8D200000
section addr CD400000 phys 8D400000
section addr CD600000 phys 8D600000
section addr CD800000 phys 8D800000
section addr CDA00000 phys 8DA00000
section addr CDC00000 phys 8DC00000
section addr CDE00000 phys 8DE00000
section addr CE000000 phys 8E000000
section addr CE200000 phys 8E200000
section addr CE400000 phys 8E400000
section addr CE600000 phys 8E600000
section addr CE800000 phys 8E800000
section addr CEA00000 phys 8EA00000
section addr CEC00000 phys 8EC00000
section addr CEE00000 phys 8EE00000
section addr CF000000 phys 8F000000
section addr CF200000 phys 8F200000
section addr CF400000 phys 8F400000
section addr CF600000 phys 8F600000
section addr CF800000 phys 8F800000
section addr CFA00000 phys 8FA00000
section addr CFC00000 phys 8FC00000
section addr CFE00000 phys 8FE00000
section addr D0000000 phys 90000000
section addr D0200000 phys 90200000
section addr D0400000 phys 90400000
section addr D0600000 phys 90600000
section addr D0800000 phys 90800000
section addr D0A00000 phys 90A00000
section addr D0C00000 phys 90C00000
section addr D0E00000 phys 90E00000
section addr D1000000 phys 91000000
section addr D1200000 phys 91200000
section addr D1400000 phys 91400000
section addr D1600000 phys 91600000
section addr D1800000 phys 91800000
section addr D1A00000 phys 91A00000
section addr D1C00000 phys 91C00000
section addr D1E00000 phys 91E00000
section addr D2000000 phys 92000000
section addr D2200000 phys 92200000
section addr D2400000 phys 92400000
section addr D2600000 phys 92600000
section addr D2800000 phys 92800000
section addr D2A00000 phys 92A00000
section addr D2C00000 phys 92C00000
section addr D2E00000 phys 92E00000
section addr D3000000 phys 93000000
section addr D3200000 phys 93200000
section addr D3400000 phys 93400000
section addr D3600000 phys 93600000
section addr D3800000 phys 93800000
section addr D3A00000 phys 93A00000
section addr D3C00000 phys 93C00000
section addr D3E00000 phys 93E00000
section addr D4000000 phys 94000000
section addr D4200000 phys 94200000
section addr D4400000 phys 94400000
section addr D4600000 phys 94600000
section addr D4800000 phys 94800000
section addr D4A00000 phys 94A00000
section addr D4C00000 phys 94C00000
section addr D4E00000 phys 94E00000
section addr D5000000 phys 95000000
section addr D5200000 phys 95200000
section addr D5400000 phys 95400000
section addr D5600000 phys 95600000
section addr D5800000 phys 95800000
section addr D5A00000 phys 95A00000
section addr D5C00000 phys 95C00000
section addr D5E00000 phys 95E00000
section addr D6000000 phys 96000000
section addr D6200000 phys 96200000
section addr D6400000 phys 96400000
section addr D6600000 phys 96600000
section addr D6800000 phys 96800000
section addr D6A00000 phys 96A00000
section addr D6C00000 phys 96C00000
section addr D6E00000 phys 96E00000
section addr D7000000 phys 97000000
section addr D7200000 phys 97200000
section addr D7400000 phys 97400000
section addr D7600000 phys 97600000
section addr D7800000 phys 97800000
section addr D7A00000 phys 97A00000
section addr D7C00000 phys 97C00000
section addr D7E00000 phys 97E00000
section addr D8000000 phys 98000000
section addr D8200000 phys 98200000
section addr D8400000 phys 98400000
section addr D8600000 phys 98600000
section addr D8800000 phys 98800000
section addr D8A00000 phys 98A00000
section addr D8C00000 phys 98C00000
section addr D8E00000 phys 98E00000
section addr D9000000 phys 99000000
section addr D9200000 phys 99200000
section addr D9400000 phys 99400000
section addr D9600000 phys 99600000
section addr D9800000 phys 99800000
section addr D9A00000 phys 99A00000
section addr D9C00000 phys 99C00000
section addr D9E00000 phys 99E00000
section addr DA000000 phys 9A000000
section addr DA200000 phys 9A200000
section addr DA400000 phys 9A400000
section addr DA600000 phys 9A600000
section addr DA800000 phys 9A800000
section addr DAA00000 phys 9AA00000
section addr DAC00000 phys 9AC00000
section addr DAE00000 phys 9AE00000
section addr DB000000 phys 9B000000
section addr DB200000 phys 9B200000
section addr DB400000 phys 9B400000
section addr DB600000 phys 9B600000
section addr DB800000 phys 9B800000
section addr DBA00000 phys 9BA00000
section addr DBC00000 phys 9BC00000
section addr DBE00000 phys 9BE00000
section addr DC000000 phys 9C000000
section addr DC200000 phys 9C200000
section addr DC400000 phys 9C400000
section addr DC600000 phys 9C600000
section addr DC800000 phys 9C800000
section addr DCA00000 phys 9CA00000
section addr DCC00000 phys 9CC00000
section addr DCE00000 phys 9CE00000
section addr DD000000 phys 9D000000
section addr DD200000 phys 9D200000
section addr DD400000 phys 9D400000
section addr DD600000 phys 9D600000
section addr DD800000 phys 9D800000
section addr DDA00000 phys 9DA00000
section addr DDC00000 phys 9DC00000
section addr DDE00000 phys 9DE00000
section addr DE000000 phys 9E000000
section addr DE200000 phys 9E200000
section addr DE400000 phys 9E400000
section addr DE600000 phys 9E600000
section addr DE800000 phys 9E800000
section addr DEA00000 phys 9EA00000
section addr DEC00000 phys 9EC00000
section addr DEE00000 phys 9EE00000
section addr DF000000 phys 9F000000
section addr DF200000 phys 9F200000
section addr DF400000 phys 9F400000
section addr DF600000 phys 9F600000
section addr DF800000 phys 9F800000
section addr DFA00000 phys 9FA00000
section addr DFC00000 phys 9FC00000
section addr DFE00000 phys 9FE00000
pte add FFFF0000 phys 809E6000
section addr F8000000 phys 68000000
section addr FA000000 phys 48000000
section addr FA200000 phys 48200000
section addr FA300000 phys 48300000
section addr FE000000 phys 6E000000
section addr FC000000 phys 6C000000
section addr FD000000 phys 6D000000
section addr FB000000 phys 49000000
section addr FE800000 phys 54000000
section addr FEA00000 phys 54200000
section addr FEC00000 phys 54400000
section addr FEE00000 phys 54600000

   

论坛徽章:
0
2 [报告]
发表于 2016-07-19 16:01 |只看该作者
有大侠知道吗?一般采用哪种方式映射地址,一级还是二级?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
3 [报告]
发表于 2016-07-19 16:06 |只看该作者
整个low memory都采用的section映射
有一些写死的设备寄存器映射才会走到alloc_init_pte

论坛徽章:
0
4 [报告]
发表于 2016-07-25 13:42 |只看该作者
谢谢 arm-linu-gcc。

论坛徽章:
0
5 [报告]
发表于 2016-08-28 00:36 |只看该作者
其实代码注释里面已经写的很清楚了,虚拟地址在满足SECTION_MASK边界对齐情况下,优先使用section映射,不对齐才会使用PTE;
你可以把bank1内存的结束地址修改下(0x8440 0000->0x843f 0000),就能看见PTE了;
另外内核通常使用3级页表,PGD/PUD,PMD,PTE;PMD的每个表项可以映射2M地址空间,PTE有512个表项,每个表项可以映射4K地址空间;

#define SECTION_MASK                (~(SECTION_SIZE-1))
/*
         * Try a section mapping - end, addr and phys must all be aligned
         * to a section boundary.  Note that PMDs refer to the individual
         * L1 entries, whereas PGDs refer to a group of L1 entries making
         * up one logical pointer to an L2 table.
         */
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP