zoukankan      html  css  js  c++  java
  • linux启动过程中建立临时页表

    intel的x86这种架构为了兼容以前同系列的架构有一些很繁琐无用的东西。比如分段和分页两种机制都可以实现隔离进程的内存空间,在x86上两种机制都有,用起来比较繁琐。所以linux内核在启动的时候通过把各个段的起始地址都设置成0,把逻辑地址直接映射到虚拟地址,也就是说在linux里逻辑地址和虚拟地址是相等的。所以看linux内存管理的时候集中精力于分页这种方式就可以了。

    linux启动分两个阶段:

    • 第一个阶段(汇编)建立分段机制(忽略),建立一个临时页表进入分页机制。
    • 第二个阶段(C语言)初始化系统的各种资源(硬件/软件)。

    这篇只讨论建立临时页表的过程。

    linux内核被加载进内存以后,在内存空间的分布如下图:

    这个映射图可以参考arch/i386/kernel/vmlinux.lds.S里的代码

    不管在临时分页机制里还是之后真正的分页机制里linux要调用自己的函数是需要把自身映射进页表里的。在进入真正的分页机制之前linux需要一个临时的内存管理系统来管理低端内存,所以这个临时的内存管理系统也需要映射进页表。需要映射进页表的内存包括:

    • linux内核。
    • 临时页表(这个不一定需要映射进页表,但是为了方便也这么做了)。
    • 128k的临时内存管理系统(其实就是用的位图管理1G的低端内存,2^32/4096/8 = 128K)。

    好了,可以看代码了

    page_pde_offset = (__PAGE_OFFSET >> 20);
    
            movl $(pg0 - __PAGE_OFFSET), %edi
            movl $(swapper_pg_dir - __PAGE_OFFSET), %edx
            movl $0x007, %eax                       /* 0x007 = PRESENT+RW+USER 这是页表属性*/
    10:
            leal 0x007(%edi),%ecx                   /* Create PDE entry */
            movl %ecx,(%edx)                        /* Store identity PDE entry */
            movl %ecx,page_pde_offset(%edx)         /* Store kernel PDE entry */
            addl $4,%edx                            
            movl $1024, %ecx                        /*1024个页表*/
    11:
            stosl
            addl $0x1000,%eax
            loop 11b
            /* End condition: we must map up to and including INIT_MAP_BEYOND_END */
            /* bytes beyond the end of our own page tables; the +0x007 is the attribute bits */
            leal (INIT_MAP_BEYOND_END+0x007)(%edi),%ebp
            cmpl %ebp,%eax
            jb 10b
            movl %edi,(init_pg_tables_end - __PAGE_OFFSET)

    swapper_pg_dir就是页目录,在内核的.bss段,临时页表从pg0开始,查询arch/i386/kernel/vmlinux.lds.S可见pg0就在_end之后,128k就在临时页表之后。具体映射了多大的空间是不确定的,但是大概是8M,因为开始留了1M空间,内核大概占4M再加上页表本身和128K,两个页目录能映射8M内存正好包含这几项内容,所以一般书上会说映射了8M内存。

    还有一个比较重要的是给init_pg_tables_end的赋值为最后一个页表的地址,所以紧跟init_pg_tables_end之后的是那128k的临时内存管理系统,再之后的内存都是空闲可用内存。

  • 相关阅读:
    曹工说Spring Boot源码(18)-- Spring AOP源码分析三部曲,终于快讲完了 (aop:config完整解析【下】)
    曹工说Spring Boot源码(17)-- Spring从xml文件里到底得到了什么(aop:config完整解析【中】)
    曹工说Spring Boot源码(16)-- Spring从xml文件里到底得到了什么(aop:config完整解析【上】)
    曹工说Spring Boot源码(15)-- Spring从xml文件里到底得到了什么(context:load-time-weaver 完整解析)
    期货
    手机像素密度的计算公式
    线性代数第一讲 行列式01
    matlab找出某个元素的位置序号
    《树先生》影评
    当你的才华还不足以支撑起你的野心时,你就该静下心来学习
  • 原文地址:https://www.cnblogs.com/4a8a08f09d37b73795649038408b5f33/p/10154324.html
Copyright © 2011-2022 走看看