page_pde_offset = (__PAGE_OFFSET >> 20);                /* __PAGE_OFFSET是0xc0000000,page_pde_offset = 3072 = 0xc00,是页目录中的偏移 */
36
37 movl $(pg0 - __PAGE_OFFSET), %edi /* 将pg0对应的物理地址送到edi */
38 movl $(swapper_pg_dir - __PAGE_OFFSET), %edx /* 将swapper_pg_dir(存放临时页全局目录的地址)送到edx */
39 movl $0x007, %eax /* 0x007 = PRESENT+RW+USER */
40 10:
41 leal 0x007(%edi),%ecx /* Create PDE entry —— 构造一个页目录项(地址+标志位),把edi指向的物理地址加上0x007放入ecx中 */
42 movl %ecx,(%edx) /* 第一次循环时把ecx中的内容放入swapper_pg_dir的第0项里,第二次循环时把ecx中的内容放入swapper_pg_dir的第1项里 */
43 movl %ecx,page_pde_offset(%edx) /* Store kernel PDE entry */
44 addl $4,%edx /* edx加上一个页目录项长度(4字节),指向页全局目录的下一个页目录项地址 */
45 movl $1024, %ecx /* 初始化1024个页目录项,设置计数器 */
46 11:
47 stosl /* eax -> [edi]; edi = edi + 4 */
48 addl $0x1000,%eax /* 更改eax的值,为下次stosl作准备 */
49 loop 11b /* 循环操作,其实就是初始化1024个页表项 */
50 /* End condition: we must map up to and including INIT_MAP_BEYOND_END */
51 /* bytes beyond the end of our own page tables; the +0x007 is the attribute bits */
52 leal (INIT_MAP_BEYOND_END+0x007)(%edi),%ebp /* ebp = edi指向的物理地址 + INIT_MAP_BEYOND_END(128K)+ 0x007 */
53 cmpl %ebp,%eax /* 比较ebp与eax */
54 jb 10b /* 如果eax < ebp,则跳到上面10的地方 */
55 movl %edi,(init_pg_tables_end - __PAGE_OFFSET) /* 此时的edi中存放pg0+0x2000,将此值存入init_pg_tables_end中,表示页表初始化结束 */
56

下面的是较详细的解释(结合我的作业题目):

初始化临时内核页表是在startup_32汇编语言函数中完成的。在ULK所述中,假设内核能容纳于RAM的前8MB空间,然后对RAM的前8MB进行恒等映射
(例如用户地址0x00003000映射物理地址0x00003000,0xc0003000映射到物理地址0x00003000),来初始化临时页全局目录swapper_pg_dir和相应的页表。
映射8MB只需要填充swapper_pg_dir中第0项,1项,768项和769项。前两项是给用户线性地址映射,后两项给内核线性地址映射。用页全局目录里的两项就能对8MB映射的
理由是2×1024(页表有1024项)×4K(一页的大小)=8M。实际上初始化内核页表来对RAM的前8MB映射不是个硬性的规定。
这取决于你的内核的配置(我认为大多数情况下是对8MB映射)。在startup_32中可以看到,对多少内存进行映射是通过pg0动态判断的。   linux/arch/i386/kernel/head.S   page_pde_offset = (__PAGE_OFFSET >> 20);   /*__PAGE_OFFSET是0xc0000000,内核线性空间的起始地址。   page_pde_offset=0xc00(十进制为3072)*/   movl $(pg0 - __PAGE_OFFSET), %edi   /*假设pg0的物理地址(00567000),放入edi中。*/   movl $(swapper_pg_dir - __PAGE_OFFSET), %edx   /*swapper_pg_dir的物理地址,放入edx中。*/   movl $PTE-ATTR, %eax   /* PTE-ATTR=0x007 页目录项和页表项的低12位是标志位,把标志位0x007放入eax中。*/   10:   leal PDE-ATTR(%edi),%ecx /* Create PDE entry */   /*第一循环时把edi指向的pg0的物理地址加上PDE-ATTR放入ecx中。   第二次循环时把edi指向的物理地址0x567000加上PDE-ATTR放入ecx中。
  linux2.6/arch/x86/kernel/head_32.S 中的PDE-ATTR=0x067
*/   movl %ecx,(%edx) /* Store identity PDE entry */   /*第一次循环时把ecx中的内容放入swapper_pg_dir的第0项里。   第二次循环时把ecx中的内容放入swapper_pg_dir的第1项里。*/   movl %ecx,page_pde_offset(%edx) /* Store kernel PDE entry */   /*第一次循环时把ecx中的内容放入swapper_pg_dir的第768项里。因为前面算出page_pde_offset的值为3072,而swapper_pg_dir中每项是4个字节,所以3072/4=768。   第二次循环时把ecx中的内容放入swapper_pg_dir的第769项里。*/   addl $4,%edx   /*第一次循环时,此时edx指向swapper_pg_dir的第1项。   第二次循环时,此时edx指向swapper_pg_dir的第2项。*/   movl $1024, %ecx   /*为初始化1024个页表项设置计数*/   11:   stosl   /*把eax中的内容放入edi指向的物理地址中,然后edi+4。*/   addl $0x1000,%eax   loop 11b   /*跳到上面的11处循环。   第一次执行1024次后,从pg0物理地址(0x567000)开始存放的是0x007,0x1007,0x2007,...,0x3ff007,也就是当前能够映射到物理地址从0x000到0x3fffff处。此时edi中的值为0x567000。   第二次执行1024次后,从物理地址(0x568000)开始存放的是0x400007,0x401007,0x402007,...,7ff007,也就是当前能够映射到物理地址0x000到7fffff处,正好8MB。此时edi中的值为0x568000。*/   leal (INIT_MAP_BEYOND_END+PTE-ATTR)(%edi),%ebp   /*INIT_MAP_BEYOND_END的值为128k,在此文件中的一个宏定义。把edi指向的物理地址加上128k加上0x007放入edp中。*/   cmpl %ebp,%eax   /*在第一次循环中ebp中的值为0x567007,eax中的值为0x400007小于0x515007。当前所映射到的最大物理地址为0x3fffff没有包含0x567007,所以没有映射完。   在第二次循环中ebp中的值为0x568007,eax中的值为0x800007大于0x568007。当前所映射到的最大物理地址为0x7fffff包含了0x568007,所以物理地址映射完毕。*/   jb 10b   /*第一次循环做完时跳到上面的10处继续循环   第二次循环做完时跳出循环。*/

题目:

 在32位pc中,结合Linux2.6.26/arch/x86/kernel/head_32.S中228-251行相关代码,关于临时2级页表的初始化过程,假设pg0所在的物理地址是0x567000,回答下列问题(以下涉及到数值的地方,请用16进制表示):
1.填写在swapper_pg_dir中第0x0项的内容是什么,有什么含义?
2.若填写了swapper_pg_dir中第0x1项,则此内容是什么? 
3.填写在pg0的第0x0项、第0x1项和第0x3FF项的内容是多少,有什么含义?
4.根据swapper_pg_dir的第0x0项和pg0的内容,这个临时页表所代表的地址空间中,0~4MB-1的空间被映射的物理地址空间范围是什么?
5.若内核地址空间从3G开始,那么填写在swapper_pd_dir中第0x300项和0x301项的内容是什么,与上述第0项和第1项有什么关系,有什么含义?

综上分析:

1):填写在swapper_pg_dir中的第0项的内容是:0x567067
2):填写在swapper_pg_dir中的第1项的内容是:0x568067
3):填写在pg0的第0项是0x007
   填写在pg0的第1项是0x1007
   填写在pg0的第0x3FF项是0x3FF007

4):0-4M-1的空间对应的物理地址空间为:0x000-0x3fffff

5):swapper_gd_dir的第768项和769项的内容分别为:0x567067和0x568067

和第0项和第1项是相同的。因为第0,1项是给用户线性地址映射的。而前者是为内核线性地址映射的。

中间有什么错误,望同学指出!

临时2级页表的初始化过程 head_32.S 相关代码解释的更多相关文章

  1. linux内存管理解析1----linux物理,线性内存布局及页表的初始化

    主要议题: 1分页,分段模式及实模式 2Linux分页 3linux内存线性地址空间布局及物理内存空间布局 4linux页表初始化及代码解析 1.1.1内存寻址和保护模式 在X86平台上,内存控制单元 ...

  2. java代码的初始化过程研究

        刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...

  3. Java对象相关元素的初始化过程

    1.类的成员变量.构造函数.成员方法的初始化过程 当一个类使用new关键字来创建新的对象的时候,比如Person per = new Person();JVM根据Person()寻找匹配的类,然后找到 ...

  4. linux内存源码分析 - 页表的初始化

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 本文章中系统我们假设为x86下的32位系统,暂且不分析64位系统的页表结构. linux分页 linux下采用四 ...

  5. KVM地址翻译流程及EPT页表的建立过程

    本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/9284635 ------------------ ...

  6. Linux内存管理 (2)页表的映射过程

    专题:Linux内存管理专题 关键词:swapper_pd_dir.ARM PGD/PTE.Linux PGD/PTE.pgd_offset_k. Linux下的页表映射分为两种,一是Linux自身的 ...

  7. 启动期间的内存管理之初始化过程概述----Linux内存管理(九)

    在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检 ...

  8. ABP中模块初始化过程(二)

    在上一篇介绍在StartUp类中的ConfigureService()中的AddAbp方法后我们再来重点说一说在Configure()方法中的UserAbp()方法,还是和前面的一样我们来通过代码来进 ...

  9. linux文件系统初始化过程(3)---加载initrd(上)

    一.目的 本文主要讲述linux3.10文件系统初始化过程的第二阶段:加载initrd. initrd是一个临时文件系统,由bootload负责加载到内存中,里面包含了基本的可执行程序和驱动程序.在l ...

随机推荐

  1. Ensemble learning(集成学习)

    集成学习:是目前机器学习的一大热门方向,所谓集成学习简单理解就是指采用多个分类器对数据集进行预测,从而提高整体分类器的泛化能力. 我们在前面介绍了.所谓的机器学习就是通过某种学习方法在假设空间中找到一 ...

  2. 第二百四十二天 how can I 坚持

    今天... 貌似没啥啊. 第一天带帽子上班. 还有回来买了两个柚子吃了,有点上火啊. 还有今天雾霾爆表啊,pm2.5  600多啊. 还有看了部电影<蚁人>,挺好看.希望不会出二.三.四. ...

  3. 采用现代Objective-C

    多年来,Objective-C语言已经有了革命性的发展.虽然核心理念和实践保持不变,但语言中的部分内容经历了重大的变化和改进.现代化的Objective-C在类型安全.内存管理.性能.和其他方面都得到 ...

  4. CodeForces 455C Civilization (并查集+树的直径)

    Civilization 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/B Description Andrew plays a ...

  5. iOS学习之自动布局

    Autolayout: 最重要的两个概念: 约束:对控件位置和大小的限定条件 参照:对控件设置的约束是相对于哪一个视图而言的 自动布局的核心计算公式: obj1.property1 =(obj2.pr ...

  6. #JAVA操作LDAP

    package com.wisdombud.unicom.monitor.ldap; import java.util.ArrayList; import org.slf4j.Logger; impo ...

  7. jquery easyui的异步tree

    1.创建一个简单的tree 结果如图: <script> $(function(){ $('#tt').tree(){ url:'要提交的url地址', checkbox:true, li ...

  8. Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor (链表)

    题目链接:http://codeforces.com/contest/670/problem/E 给你n长度的括号字符,m个操作,光标初始位置是p,'D'操作表示删除当前光标所在的字符对应的括号字符以 ...

  9. C#下内存管理--垃圾收集

    章节安排 内存管理简介 垃圾回收机制 性能问题 C#下非托管资源的处理 要强调的几点 References 内存管理简介 对于任何一种编程语言,内存管理都是不得不提很重要的一块内容,但可惜的是目前为止 ...

  10. json jar包支持

    json-lib工具包(json核心包)下载地址: http://sourceforge.net/projects/json-lib/files/json-lib/json-lib-2.4/ json ...