最近开始学习linux内核,看了《深入理解linux内核》,开始写点学习收获。内核版本为2.6.11  

  临时全局目录(provisional page global directory)是在内核编译过程中静态初始化的,而临时页表是由startup_32()汇编语言函数(定义于arch/i386/kernel/head.S)初始化的。临时页全局目录放在swapper_pg_dir变量中,swapper_pg_dir有1024个项,但是如果只是初始化前8MB的话,只需要用到两个目录项。临时页表在pg0变量处开始存放,紧接在内核未初始化的数据段。(_end符号后面)。通过查看/boot/System.map,可以找到swapper_pg_dir的地址,例如0xc047d000 (抄了某位前辈的数据,由于不知道原始作者是谁,就先在这声明下。这个数据是编译时产生的所以,因机器而异,后面的数据同此处)。pg0的线性地址为0xc04f4000。之后我们进入代码:  

 1     movl $(pg0 - __PAGE_OFFSET), %edi   2     /* move pg0 - __PAGE_OFFSET = c04f4000-c0000000=4f4000 => edi  3        相当于第一个页表项的初始物理地址        */ 4     movl $(swapper_pg_dir - __PAGE_OFFSET), %edx   5     /* c047d000 - c0000000 = 47d000 => edx  6            相当于第一个页目录项的初始物理地址         */ 7     movl $0x007, %eax             8     /* 0x007 = PRESENT+RW+USER  9            这里为什么要加7呢,因为无论是页表项还是页目录项的前20位是物理地址,后12位为状态字10            这里的加7实际上就是将后三位也就是PRESENT,RW,USER三位置为    */11 10:12     leal 0x007(%edi),%ecx            13     /* Create PDE entry 14        由于这里是设置页目录项的,所以将页表项的第一项物理地址+715        如果带入我们之前的值的话,ecx = 4f4007即页表项的第一项的物理地址,16        加上PRESENT,RW,USER三个标志位    */17     movl %ecx,(%edx)            18     /* Store identity PDE entry 19        将4f4007存储到edx中 即swapper_pg_dir[0]也就是47d000这个地址    */20     movl %ecx,page_pde_offset(%edx)        21     /* Store kernel PDE entry 22        将4f4007存储到内核的页表空间中 即swapper_pg_dir[0x300]也就是c047d000这个地址*/23     addl $4,%edx24     /* swapper_pg_dir指针向下移动一个entry,也就是4个字节*/25     movl $1024, %ecx26     /* 初始化计数器,循环1024次,也就是1024个页表*/27 11:28     stosl29     /* 把eax中的内容放入edi指向的物理地址中,然后edi+4。30        edi指向的地址为pg0的地址,之前eax赋值为7,所以pg0的第一项也就是地址4f4000的值为00000007*/31     addl $0x1000,%eax32     /* 移动指针到下一个页的地址,因为一个页的大小为4096,即0x1000个字节 */33     loop 11b34     /* 经过循环将pg0的1024个表项都进行赋值 */35     /* End condition: we must map up to and including INIT_MAP_BEYOND_END */36     /* bytes beyond the end of our own page tables; the +0x007 is the attribute bits */37     leal (INIT_MAP_BEYOND_END+0x007)(%edi),%ebp38     /* INIT_MAP_BEYOND_END = 128k,文件中定义的。也就是目前pg0的指针+128k内核空间+7是否被全部映射(<ebp),39        如果没有呗全部映射,则跳到10,再映射4MB空间。*/40     cmpl %ebp,%eax41     jb 10b42     movl %edi,(init_pg_tables_end - __PAGE_OFFSET)43     /* 如果映射完成,则将gp0末尾地址赋值给init_pg_tables_end*/

简单的画了个图

终于搞明白了这个临时内核页表是怎么建立的了,明天继续。。。

转载于:https://www.cnblogs.com/lazygunner/archive/2011/11/08/2241699.html

linux内核学习笔记【一】临时内核页表 Provisional kernel Page Tables相关推荐

  1. 我的内核学习笔记14:内核设备树学习

    李迟按: 上一篇内核的文章是2年半前,期间因工作转行而停止研究,最近又重新捡起.这个系列从2013年起间断地更新,本来想从系统角度逐步写的,但工作量十分庞大,现在也想通了,在适合的时间写,不带目的,不 ...

  2. 操作系统进程学习(Linux 内核学习笔记)

    操作系统进程学习(Linux 内核学习笔记) 进程优先级 并非所有进程都具有相同的重要性.除了大多数我们所熟悉的进程优先级之外,进程还有不同的关键度类别,以满足不同需求.首先进程比较粗糙的划分,进程可 ...

  3. Zynq-7000系列之linux开发学习笔记:编译Linux内核和制作设备树(六)

    开发板:Zynq7030数据采集板 PC平台:Ubuntu-18.04 + MobaXterm 开发环境:Xilinx Vivado + SDK -18.3 交叉编译工具:arm-linux-gnue ...

  4. 《寒江独钓》内核学习笔记

    <寒江独钓>内核学习笔记(1)-- IRP - .Little Hann 时间 2013-11-30 15:40:00  博客园_.Little Hann原文  http://www.cn ...

  5. Windows x64内核学习笔记(五)—— KPTI(未完待续)

    Windows x64内核学习笔记(五)-- KPTI(未完待续) KPTI 实验一:构造IDT后门并读取Cr3 参考资料 KPTI 描述:KPTI(Kernel page-table isolati ...

  6. Windows x64内核学习笔记(四)—— 9-9-9-9-12分页

    Windows x64内核学习笔记(四)-- 9-9-9-9-12分页 前言 9-9-9-9-12分页 实验一:线性地址转物理地址 页表基址 定位基址 PTE to PXE 实验二:通过页表基址定位各 ...

  7. Windows x64内核学习笔记(三)—— SMEP SMAP

    Windows x64内核学习笔记(三)-- SMEP & SMAP SMEP & SMAP 实验:构造IDT后门 第一步:编译以下代码 第二步:构造IDT后门 第三步:运行程序 第四 ...

  8. Windows x64内核学习笔记(一)—— 环境与配置

    Windows x64内核学习笔记(一)-- 环境与配置 前言 新特性 基础要求 实验环境 Guest Win10配置 问题解决 参考资料 前言 之前,跟着海哥学习了windows内核的一些机制,包括 ...

  9. 我的内核学习笔记5:proc目录文件创建及读写

    上一篇内核学习笔记<我的内核学习笔记4:sysfs学习>是2013年写的,彼时至今,随着工作的展开和安排,内核方面的知识可谓突飞猛进,当然,其它方面亦是如此.关于内核方面,积累的笔记大大小 ...

最新文章

  1. linux学习笔记四:安装lsusb
  2. 在JavaScript中使用正好两位小数格式化数字
  3. Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34)
  4. python使用异常的目的和好处_python 错误与异常,python assert的作用
  5. java pc计数器_java虚拟机-程序计数器PC Register
  6. java 不允许默认构造_java – 如何使用ObjectMapper去除/序列化不可变对象而不使用默认构造函数?...
  7. oracle undo段的作用,Oracle数据库中Undo数据段的作用及类型
  8. 外链引入css有哪些方式_外链怎么发才会快速收录?
  9. oracle创建时分秒列,oracle 11g 分区表创建(年月日周时分秒)
  10. VC++多线程工作笔记0001---认识与创建线程
  11. while 循环java_Java做while循环
  12. ubuntu退出mysql sql语句_Ubuntu 16.04安装、卸载mysql及怎么使用SQL常用操作语句
  13. 海康威视-网络通讯库错误码
  14. 解决:ipad QQ可以联网,浏览器不能联网
  15. WPF的介绍和XAML语言
  16. 增强现实(AR)的前世今生...
  17. 8.2 JVM命令行监控——jstat
  18. 面试 mysql引擎
  19. python kivy 手势识别基本代码
  20. mcp25625 CAN控制嚣

热门文章

  1. 循环单链表 python_循环单链表报错
  2. 【java】RMI教程:入门与编译方法 远程
  3. 【Elasticsearch】Elasticsearch filter和query的不同
  4. 【Redis】redis 配置 配置文件 redis.conf
  5. 【clickhouse】MergeTree引擎的固定/自适应索引粒度
  6. 【Kafka】 kafka集群升级导致broker.id发生变动变动引起的问题
  7. Maven : JsonMappingException: Incompatible Jackson version: 2.9.5
  8. Kafka : WARN Error while fetching metadata with correlation id xx : {=UNKNOWN_TOPIC_OR_PARTITION}
  9. 【Flink】No tests found matching Method xx from org.junit.internal.requests.ClassRequest
  10. 【Linux】linux系统很卡排除