linux内核学习笔记【一】临时内核页表 Provisional kernel Page Tables
最近开始学习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相关推荐
- 我的内核学习笔记14:内核设备树学习
李迟按: 上一篇内核的文章是2年半前,期间因工作转行而停止研究,最近又重新捡起.这个系列从2013年起间断地更新,本来想从系统角度逐步写的,但工作量十分庞大,现在也想通了,在适合的时间写,不带目的,不 ...
- 操作系统进程学习(Linux 内核学习笔记)
操作系统进程学习(Linux 内核学习笔记) 进程优先级 并非所有进程都具有相同的重要性.除了大多数我们所熟悉的进程优先级之外,进程还有不同的关键度类别,以满足不同需求.首先进程比较粗糙的划分,进程可 ...
- Zynq-7000系列之linux开发学习笔记:编译Linux内核和制作设备树(六)
开发板:Zynq7030数据采集板 PC平台:Ubuntu-18.04 + MobaXterm 开发环境:Xilinx Vivado + SDK -18.3 交叉编译工具:arm-linux-gnue ...
- 《寒江独钓》内核学习笔记
<寒江独钓>内核学习笔记(1)-- IRP - .Little Hann 时间 2013-11-30 15:40:00 博客园_.Little Hann原文 http://www.cn ...
- Windows x64内核学习笔记(五)—— KPTI(未完待续)
Windows x64内核学习笔记(五)-- KPTI(未完待续) KPTI 实验一:构造IDT后门并读取Cr3 参考资料 KPTI 描述:KPTI(Kernel page-table isolati ...
- Windows x64内核学习笔记(四)—— 9-9-9-9-12分页
Windows x64内核学习笔记(四)-- 9-9-9-9-12分页 前言 9-9-9-9-12分页 实验一:线性地址转物理地址 页表基址 定位基址 PTE to PXE 实验二:通过页表基址定位各 ...
- Windows x64内核学习笔记(三)—— SMEP SMAP
Windows x64内核学习笔记(三)-- SMEP & SMAP SMEP & SMAP 实验:构造IDT后门 第一步:编译以下代码 第二步:构造IDT后门 第三步:运行程序 第四 ...
- Windows x64内核学习笔记(一)—— 环境与配置
Windows x64内核学习笔记(一)-- 环境与配置 前言 新特性 基础要求 实验环境 Guest Win10配置 问题解决 参考资料 前言 之前,跟着海哥学习了windows内核的一些机制,包括 ...
- 我的内核学习笔记5:proc目录文件创建及读写
上一篇内核学习笔记<我的内核学习笔记4:sysfs学习>是2013年写的,彼时至今,随着工作的展开和安排,内核方面的知识可谓突飞猛进,当然,其它方面亦是如此.关于内核方面,积累的笔记大大小 ...
最新文章
- linux学习笔记四:安装lsusb
- 在JavaScript中使用正好两位小数格式化数字
- Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34)
- python使用异常的目的和好处_python 错误与异常,python assert的作用
- java pc计数器_java虚拟机-程序计数器PC Register
- java 不允许默认构造_java – 如何使用ObjectMapper去除/序列化不可变对象而不使用默认构造函数?...
- oracle undo段的作用,Oracle数据库中Undo数据段的作用及类型
- 外链引入css有哪些方式_外链怎么发才会快速收录?
- oracle创建时分秒列,oracle 11g 分区表创建(年月日周时分秒)
- VC++多线程工作笔记0001---认识与创建线程
- while 循环java_Java做while循环
- ubuntu退出mysql sql语句_Ubuntu 16.04安装、卸载mysql及怎么使用SQL常用操作语句
- 海康威视-网络通讯库错误码
- 解决:ipad QQ可以联网,浏览器不能联网
- WPF的介绍和XAML语言
- 增强现实(AR)的前世今生...
- 8.2 JVM命令行监控——jstat
- 面试 mysql引擎
- python kivy 手势识别基本代码
- mcp25625 CAN控制嚣
热门文章
- 循环单链表 python_循环单链表报错
- 【java】RMI教程:入门与编译方法 远程
- 【Elasticsearch】Elasticsearch filter和query的不同
- 【Redis】redis 配置 配置文件 redis.conf
- 【clickhouse】MergeTree引擎的固定/自适应索引粒度
- 【Kafka】 kafka集群升级导致broker.id发生变动变动引起的问题
- Maven : JsonMappingException: Incompatible Jackson version: 2.9.5
- Kafka : WARN Error while fetching metadata with correlation id xx : {=UNKNOWN_TOPIC_OR_PARTITION}
- 【Flink】No tests found matching Method xx from org.junit.internal.requests.ClassRequest
- 【Linux】linux系统很卡排除