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的临时内存管理系统,再之后的内存都是空闲可用内存。

linux启动过程中建立临时页表的更多相关文章

  1. 嵌入式Linux启动过程中的问题积累

    嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Num ...

  2. 如何设置linux启动过程中的停止阶段

    设置方法: 1 启动过程中点击“e”键(fedora)或者"tab"(centOS)键进入目标启动项的命令行参数下,移除initrd所在行末尾的"quiet" ...

  3. Linux启动过程中几个重要配置文件的执行过程

    Linux 登录后,配置执行顺序为(Debian Serials Capable):/etc/environment -> /etc/profile -> (~/.bash_profile ...

  4. Linux系统在启动过程中mbr主引导程序被破坏的解决方案

    首先,mbr主引导程序被破坏是指系统在启动过程中,磁头找不到/boot分区(windows的启动分区在c盘). 1)下面我们模拟主引导分区被破坏的情况:(在启动分区划分446M的存储大小) 2)重启( ...

  5. Linux 启动过程详解

    目录 1. Linux启动过程 2. 启动过程概述 3. 引导加载阶段 4. 内核阶段 4.1 内核加载阶段 4.2 内核启动阶段 5. 早期的用户空间 6. 初始化过程 6.1 SysV init ...

  6. 深入理解Linux启动过程

    深入理解Linux启动过程       本文详细分析了Linux桌面操作系统的启动过程,涉及到BIOS系统.LILO 和GRUB引导装载程序,以及bootsect.setup.vmlinux等映像文件 ...

  7. Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...

  8. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  9. 从Linux启动过程到android启动过程

    Linux启动过程: 1.首先开机给系统供电,此时硬件电路会产生一个确定的复位时序,保证cpu是最后一个被复位的器件.为什么cpu要最后被复位呢?因为 如果cpu第一个被复位,则当cpu复位后开始运行 ...

随机推荐

  1. 小程序开发-使用Loading和Toast提示框

    小程序提示框 Loading提示框使用方式 1. 在wxml中作为组件使用 <loading hidden="{{hidden}}"> 加载中... </load ...

  2. 2020重新出发,NOSQL,MongoDB是什么?

    什么是MongoDB ? MongoDB 是一个开源的文档数据库,它基于 C++ 语言编写,性能高,可用性强,能够自动扩展. MongoDB 是最流行的 NoSQL 数据库之一,原生支持分布式集群架构 ...

  3. 转载:51cto 2019好文精选

    转载地址:https://news.51cto.com/art/202001/609544.htm 01.知识科普 傻瓜都能看懂,30张图彻底理解红黑树! TCP三次握手,四次挥手,你真的懂吗? 面试 ...

  4. idea导入spring源码

    1.环境: Intellij idea 2018.2 gradle 4.10.2 spring framework:5.2.0 注意版本不符合可能会导致编译失败. 参考版本: 1.首先下载安装 Int ...

  5. JS数据类型及常用操作

    1.字符串 2.数字类型 3.布尔类型 4.数组类型 5.字典

  6. SDL开发笔记(二):音频基础介绍、使用SDL播放音频

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. [LeetCode]11. 盛最多水的容器(双指针)

    题目 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两 ...

  8. 设计模式 | Catalog设计模式,抵御业务方需求变动

    大家好,这是一个全新的专题--设计模式. 其实可以选择的专题还有好几个,为什么选择设计模式呢?原因也很简单,首先是设计模式简单.易学.干货的文章固然好,但是普适性往往不强.另外一个很重要的点就是设计模 ...

  9. POI和EasyExcel的使用

    1.POI使用 1.1 什么是POI POI简介(Apache POI),Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office ...

  10. CPF 入门教程 - 绘图(四)

    CPF NetCore跨平台UI框架,增加了Vlc支持跨平台播放视频. 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF ...