中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011

Slides:



Advertisements
Similar presentations
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Advertisements

Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
第 4 章存储器、存储管理和 高速缓存技术 4.1 存储器和存储部件 4.2 存储器的连接 4.3 微型计算机系统中存储器的体系结构 4.4 Pentium 的虚拟存储机制和片内两级存储管理 4.5 高档微机系统中的高速缓存技术 第一次课 第二次课 第三次课.
微机原理与接口技术 第二章: ARM微处理器硬件结构
第3单元 主存管理 第3节 分页存储管理 一页一页的放………… 怎么解决分段带来的碎片问题? 页与页框 地址映射 多级页表 快表 举例
第2章 微处理器 2.1 概述 /8086微处理器 微处理器 X86/Pentium微处理器
第五讲:虚拟存储器(Virtual Memory)
第3章 奔腾系列微处理器.
第2章 微处理器及其体系结构 罗文坚 中国科大 计算机学院
3.1 虚拟存储器 3.2 内存管理方式 段页机制 3.4 Linux存储管理 3.5 小结 习题
在PHP和MYSQL中实现完美的中文显示
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
第8章 现代微型计算机 x86系列微处理器 8.2 微型计算机体系结构 8.3 存储管理技术 8.4 多任务管理与I/O管理
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
Hadoop I/O By ShiChaojie.
总 复 习.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
第四章 内存管理 (lab2).
第4章 现代微机的存储系统.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Windows网络操作系统管理 ——Windows Server 2008 R2.
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
逆向工程-汇编语言
CPU结构和功能.
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第二章 80x86计算机组织 x86微处理器 2.2 基于微处理器的计算机系统构成 2.3 中央处理机 2.4 存储器
微机原理与接口技术 ——80x86微处理器 西安邮电大学 计算机学院 范琳.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
《微型计算机原理与接口技术》 第4版 王良 宁德师范学院 吴宁 乔亚男 编著 清华大学出版社 出版
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
C语言程序设计 主讲教师:陆幼利.
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
第四章 MCS-51定时器/计数器 一、定时器结构 1.定时器结构框图
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月13日.
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
本节内容 段描述符与段选择子 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
本节内容 代码跨段 本质就是修改CS段寄存器 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
Windows98虚拟存储技术 (1)Intel80386提供的存储管理方式
信号量(Semaphore).
本节内容 内存复制指令 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
微型计算机原理与接口技术 (第2版) 赵宏伟 于秀峰 黄永平 秦贵和 北京:科学出版社 出版 吉林大学计算机科学与技术学院 制作.
段式存储管理(Segmentation)
本节内容 线性地址的管理 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
微机原理与接口技术 ——8086微处理器 西安邮电大学 计算机学院 范琳.
3.1私有内存的分配.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
Python 环境搭建 基于Anaconda和VSCode.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
大数据搜索挖掘实验室 第二章 微处理器管理模式 张华平 副教授 博士 Website: 大数据搜索挖掘实验室
基于列存储的RDF数据管理 朱敏
微机原理与接口技术 西安邮电大学计算机学院 宁晓菊.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
数据表示 第 2 讲.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
<编程达人入门课程> 本节内容 有符号数与无符号数 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
本节内容 任务段 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

中国科学技术大学计算机系 陈香兰(0512-87161316) Spring 2011 Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512-87161316) Spring 2011

上次课内容回顾 源代码简介 启动代码简介 Linux内核代码组成分析 Linux的启动层次 Linux的启动分析 2019/2/19 Linux OS Analysis

内存寻址

内容提要 X86微处理器的存储器寻址 Linux在X86上的寻址实现 2019/2/19 Linux OS Analysis

存储器地址 在intelx86处理器下,有三种不同的地址 地址转换过程 逻辑地址:每个逻辑地址由一个段(segment)和偏移量 (offset)组成 线性地址:32位无符号整数,可表示4G大小的地址空 间 物理地址:芯片级内存单元寻址。它们与从CPU的地 址引脚发送到内存总线上的电信号相对应 地址转换过程 逻辑地址 线性地址 物理地址 分段单元 分页单元 2019/2/19 Linux OS Analysis

为什么需要内存寻址机制? 保护内核不受恶意或者无意的破坏 隔离各个用户进程 方便程序的编写,使程序员可以抛开对物理内存 的考虑,而且理论上可以使用任意大小的空间 2019/2/19 Linux OS Analysis

硬件的分段单元(1) 段寄存器(segment register) 逻辑地址=段:段内偏移 使用16位段寄存器来指明当前所使用的段 有六个:cs, ss, ds, es, fs和gs CPU规定了3个寄存器的专门的用途 cs 代码段寄存器,指向存放程序指令的段 ss 堆栈段寄存器,指向存放当前堆栈的段 ds 数据段寄存器,指向存放数据的段 2019/2/19 Linux OS Analysis

从80386开始,Intel微处理器以两种不同的方式执行地址转换 实模式(20位) 16位段寄存器只记录段基址的高16位,因此段基址必 须4位对齐(末4位为0) 不采用虚拟地址空间,直接采用物理地址空间 物理地址=段寄存器值*16+段内偏移 保护模式(32位) 16位段寄存器无法直接记录段的信息,因此需要与全 局描述符表GDT配合使用 GDT中记录了每个段的信息(段描述符),段寄存器 只需记录段在GDT中的序号 2019/2/19 Linux OS Analysis

物理地址:根据页表对线性地址进行转换而得到 注意:cs寄存器还有一个很重要的功能:它含有一个两 位的域,用以指明CPU的当前特权级CPL (current privilege level),值为0代表最高优先级,值为3代表最 低优先级 线性地址=段基地址+段内偏移 其中,段基地址是根据段寄存器所指明的GDT中的段描述符 中的信息得到的 物理地址:根据页表对线性地址进行转换而得到 2019/2/19 Linux OS Analysis

GDT和段描述符 (segment descriptor) 每个段由一个段描述符来表示,一个段描述符长度为8个 字节 全局描述符表GDT (global description table)就用来存放段 描述符 GDT表也存放在RAM中,并使用一个专门的寄存器GDTR来指示 GDT表在RAM中的位置(物理起始地址) 局部描述符表LDT(Local Description Table) 根据x86,每个进程可以设置一个LDT LDT表也存放在RAM中,使用LDTR来指示当前的LDT表 2019/2/19 Linux OS Analysis

由于段的用途不一样,Intelx86提供下列几种段描述符 数据段描述符(Data Segment Descriptor) 可以描述各种用户数据段和堆栈段 代码段描述符(Code Segment Descriptor) 描述一个用户代码段 任务状态段描述符(Task State Segment Descriptor) 描述一个任务的状态段 局部描述符表描述符 描述一个LDT段 系统段描述符(System Segment Descriptor) 2019/2/19 Linux OS Analysis

段描述符主要描述如下内容 段的物理起始地址(base字段,32位) 段长度(limit字段,20位) 段长度的单位(粒度,G标志,1位) 0:字节为单位 1:4KB为单位 是否系统段(S标志,1位) 0:系统段 1:普通的段 2019/2/19 Linux OS Analysis

类型字段(Type字段,4位) 段的特权级描述字段(DPL字段,2位) 段存在标志(1位) … 例如代码段、数据段、任务状态段、局部描述符段等等 段的特权级描述字段(DPL字段,2位) 00b:只能被CPL=00b的内核代码段访问 .. 11b:可以被任意代码段访问 段存在标志(1位) 0:该段当前不在内存中 1:该段当前在内存中 … Descriptor Privilege Level 2019/2/19 Linux OS Analysis

段描述符的格式 段基址、 段长度、 其他属性 例如,0x00cf9a000000ffff 2019/2/19 Linux OS Analysis

段选择子(Segment Selector) index TI RPL 2 1 0 15 Segment selector 段选择子(Segment Selector) 16位段寄存器与GDT或LDT配合起来对相应的段 进行寻址 段寄存器中的值称为段选择子,16位 13位的索引,指定GDT表中的相应的段描述符 1位的TI(Table Indicator) (跟LDT表有关,Linux中基本未使用) 2位RPL(request privilege level) 当相应的段选择符装入到cs寄存器中时,表明了CPU 的当前特权级(用户/内核) 2019/2/19 Linux OS Analysis

( ) 段选择子的使用和段描述符的快速访问 段 描述符表 段描述符 段寄存器 非编程寄存器 段选择子 段描述符 2019/2/19 ( ) 段寄存器 非编程寄存器 段选择子 段描述符 2019/2/19 Linux OS Analysis

逻辑地址到线性地址的转换 GDT或LDT 线性地址 GDTR或LDTR 偏移 选择子 逻 辑 地 址 2019/2/19 逻 辑 地 址 Linux OS Analysis

Linux中的段 因为两者都可以划分进程的物理空间 这样程序员不必考虑进程地址的问题,也让内核 的内存管理变得简单一些 段和页的同时存在在一定程度上有点多余。 因为两者都可以划分进程的物理空间 所有的进程希望使用同样的0-4G的逻辑空间。 这样程序员不必考虑进程地址的问题,也让内核 的内存管理变得简单一些 2019/2/19 Linux OS Analysis

Linux下的全局描述符表(部分) Linux中的GDT 在include/asm-x86/segment.h中 内核数据段 用户数据段 在arch/x86/kernel/head_32.S中 用户代码段 2019/2/19 Linux OS Analysis

在arch/x86/boot/pm.c中 在arch/x86/boot/pm.c中 2019/2/19 Linux OS Analysis

arch/x86/kernel/cpu/common.c 2019/2/19

2019/2/19

__BOOT_CS 0x10=0000 0000 0001 0000b 内核代码段,在GDT中相应的段描述符各个域 有如下值 特权级 Index=2 RPL=0 0x00cf9a000000ffff 4GB 内核代码段 内核数据段 用户代码段 用户数据段 2019/2/19 Linux OS Analysis

__BOOT_DS 0x18=0000 0000 0001 1000b 内核数据段,在GDT中相应的段描述符各个域 有如下值 特权级 Index=3 RPL=0 0x00cf92000000ffff 4GB 内核代码段 内核数据段 用户代码段 用户数据段 2019/2/19 Linux OS Analysis

Linux下GDT表的初始化 1)在i386/boot/herder.S-->i386/boot/main.c: main() -- >arch/x86/boot/pm.c:go_to_protected_mode-->setup_gdt中 GDT表中的内容 GDT表基址的装载(此时还没有切换到保护模式) 切换到保护模式之后,(代码)段寄存器的装载 2)在i386/boot/compressed/head_32.S中 各个数据段寄存器的装载 3)在i386/kernel/head_32.S中 boot_gdt和GDT基址的装载 各段寄存器的重新装载 early_gdt_descr和per_cpu__gdt_page 参见arch/x86/kernel/cpu/common.c 2019/2/19 Linux OS Analysis

硬件的分页单元 分页单元:线性地址====〉物理地址 为了效率起见,线性地址被分成以固定长度为单位的组 ,称为页。 页内连续的线性地址被映射到连续的物理地址中。 把线性地址映射到物理地址的数据结构叫做页表(page table)。 页表存放在内存中,并在启用分页单元以前由内核对之进行初 始化 Intel处理器中,通过设置CR0寄存器的一个标志位来启 用分页单元。 2019/2/19 Linux OS Analysis

硬件的分页单元 区分一下页和页框的概念 一页指一系列的线性地址和包含于其中的数据 页框(page frame) 分页单元认为所有的RAM被分成了固定长度的页框 每个页框可以包含一页,也就是说一个页框的长度和 一个页的长度是一样的 页框是内存的一部分,是一个实际的存储区域。 页只是一组数据块,可以存放在任何页框中 2019/2/19 Linux OS Analysis

常规分页 第一种称为页目录表(page directory) 从i386起,intel处理器的分页单元处理4KB的页 32位的线性地址被分成3个域 目录(directory) 最高的10位 页表(Table) 中间的10位 偏移量(offset) 最低的12位 线性地址的转换分两步完成,每一步都基于一种转换表 第一种称为页目录表(page directory) 第二种称为页表(page table) 正在使用的页目录表的物理地址存放在CPU的CR3寄存 器中 2019/2/19 Linux OS Analysis

线性地址 页 页表 页目录 CR3 Intel 80x86处理器的分页 2019/2/19 Linux OS Analysis

页目录表项和页表项 页目录表项和页表项存储的都是页框的基址 4KB,12位对齐,因此最后12位被用来存放该页 的标志位,包括: 页目录表项存储对应页表的物理地址 页表项存储对应物理页面的起始地址 4KB,12位对齐,因此最后12位被用来存放该页 的标志位,包括: Present标志、Accessed标志、Dirty标志、Read/Write 标志、User/Supervisor标志、…… 如果present标志为0,分页单元就把这个线性地址存 放在处理器的CR2寄存器中,并产生一个14号异常( 缺页异常) 2019/2/19 Linux OS Analysis

硬件的分页单元 扩展分页 pentium处理器引进了扩展分页,允许页框的大小为 4K或者4M 线性地址 4M 页 页目录 CR3 2019/2/19 Linux OS Analysis

硬件保护方案 存取权限由Read/Write标志控制 级别由前面提到的User/Spuervisor标志控制 若这个标志为0,只有当CPL小于3(对linux来说,即处 理器处于内核态)时才能对此页寻址; 若这个标志为1,则总能对此页寻址 存取权限由Read/Write标志控制 标志为0,页是只读的 标志为1,则是可读写的 2019/2/19 Linux OS Analysis

分页举例 假设内核给一个正在运行的进程p1分配的线性地址 空间是0x20000000到0x2003ffff(256KB) 有效的线性地址范围为: 0x20000000:0010 0000 0000 0000 0000 0000 0000 0000b 页目录索引 (0x80=128) 页表索引 (0x0=0) 0x20003ffff:0010 0000 0000 0011 1111 1111 1111 1111b 页目录索引 (0x80=128) 页表索引 (0x3f=63) 2019/2/19 Linux OS Analysis

… p1的页表和虚拟空间 数据/代码 1023 1023 p1的页 p1的页 128 63 数据/代码 … p1的页目录 p1的页表 p1的页目录 p1的页表 2019/2/19 Linux OS Analysis

分页举例 假设进程需要读取0x20021406中的字节。 分页单元将该地址划分为3个部分: 0x20021406=0010 0000 0000 0010 0001 0100 0000 0110b 当进程无论何时试图访问0x20000000到0x2003ffff范围之 外的线性地址时,都将产生一个保护错误 页目录索引 (0x80=128) 页表索引 (0x21) 页内偏移 (0x406) Xxx xxx Xx xx 缺页异常 + + Present=0 xxxx CR3 p1的页目录 p1的页表 2019/2/19 Linux OS Analysis

Linux的分页 Linux采用3级分页模式 页全局目录(Page Global Directory) 页中间目录(Page Middle Directory) 页表(Page Table) 2019/2/19 Linux OS Analysis

Linux 的分页模式 线性地址 页 页表 中间 页目录 全局 页目录 CR3 2019/2/19 Linux OS Analysis

Linux进程的分页 Linux对进程的处理很大程度上依赖于分页。实际 上,由硬件提供的MMU将线性地址自动转换为物 理地址使得下面的设计目标变得可行: 给每个进程分配一块不同的物理地址空间,这种 机制确保了对寻址错误提供有效的保护 区别页(即一组数据)和页框(实际的物理空间)之间 的不同。这是虚拟存储器机制的基本因素 2019/2/19 Linux OS Analysis

因此,当新进程恢复在CPU上执行时,分页单元 将使用一组与新进程对应的页表 每个进程都有它自己的页全局目录和自己的页表 集合,当进程切换发生时,linux把CR3寄存器的 值保存在跟进程相关的一个数据结构中,然后用 另外一个进程相应的值填充CR3寄存器。 因此,当新进程恢复在CPU上执行时,分页单元 将使用一组与新进程对应的页表 2019/2/19 Linux OS Analysis

Linux对页表的处理函数 硬件提供了这种转换机制,而软件所要做的就是准备 好正确的数据,使得硬件能够准确无误的执行 include/asm_x86/page.h include/asm_x86/pgtable.h include/asm_x86/pgtable_2level.h ...... 2019/2/19 Linux OS Analysis

线性地址字段 PAGE_SHIFT PMD_SHIFT PGDIR_SHIFT PTRS_PER_PTE PTRS_PER_PMD PTRS_PER_PGD … 2019/2/19 Linux OS Analysis

页表的处理 表项类型: include/asm_1386/page_32.h 页的保护: include/asm_1386/page.h pte_t, pmd_t, pgd_t 页的保护: include/asm_1386/page.h pgprot_t 无符号整数与上述各类型的转换 __pte(), __pmd(), __pgd(), __pgprot() pte_val(), pmd_val(), pgd_val(), pgprot_val() 2019/2/19 Linux OS Analysis

判断/读/写/修改各表项的操作 pte_none(), pmd_none(), pgd_none() 判断对应表项值是否为0 pte_present(), pmd_present(), pgd_present() 判断对应表项的present标志是否1 pte_clear(), pmd_clear(), pgd_clear() 清除相应页表的一个表项 pmd_bad(), pgd_bad() 检查相应目录项是否不能使用 pte_read(), pte_write(), pte_exec(), … 2019/2/19 Linux OS Analysis

保留的页框 内核代码和静态数据结构存放在一组保留的页框 中。这些页框所含的页从来不会被动态的分配或 者交换到磁盘上 作为一条常规,linux内核被安装在物理地址 0x00100000开始的地方。 一个Linux内核所需的页框总数依赖于该内核的 配置方案 基于典型配置的内核可以被安装在小于2MB的RAM 中 1MB 2019/2/19 Linux OS Analysis

为什么选择从1MB开始? 观察0~1MB的使用情况 为避免使用不连续的物理内存,Linux选择从 1MB开始 0x0~0x1000:BIOS使用 0x000a0000~0x000fffff:BIOS例程、VRAM等等 为避免使用不连续的物理内存,Linux选择从 1MB开始 2019/2/19 Linux OS Analysis

Linux2.4内核的前512个页框,2MB (假定内核所需内存<1MB) 不可用的页框 可用的页框 内核代码 初始化过的内核数据 未初始化过的内核数据 2019/2/19 Linux OS Analysis

进程页表 一个进程的线性地址空间被分成两部分 进程的页全局目录 0~3G:用户态和内核态都可以访问 3G~4G:只有内核态可以访问 前768项:用来映射低于0xc0000000的线性地址,具 体内容与进程相关。 剩余的表项:用来映射内核空间,对所有进程都一样 2019/2/19 Linux OS Analysis

内核空间 Linux把内核代码映射到了0xc0000000以上的空间 以前的链接描述文件 2019/2/19 Linux OS Analysis

内核页表 实际上,内核映象在被装入内存以后,CPU仍然 运行于实模式下,分页单元还没有被启动 内核分两个阶段初始化自己的页表 在i386/kernel/head_32.S中启动 内核分两个阶段初始化自己的页表 一,仅创建够自己使用的空间 二,利用剩余的RAM并恰当的建立映射整个物理内 存的页表 2019/2/19 Linux OS Analysis

Linux的临时内核页表 i386/kernel/head_32.S arch/x86/kernel/head_32.S 参见vmlinux_32.lds.S 2019/2/19 Linux OS Analysis

Linux的分页 开启分页单元 2019/2/19 Linux OS Analysis

首先填写页目录项(低地址端+3G高地址端) 然后填写pg0中的1024项 指向pg0等(由edi指向) 然后填写pg0中的1024项 物理地址底端4M,页表项的值由eax维护 2019/2/19 Linux OS Analysis

页表初始化结束条件 2019/2/19

最终内核页表 最终内核页全局目录仍然保留在变量 swapper_pg_dir中。它由函数pagetable_init初始 化 参见arch/x86/mm/init_32.c 低端页目录项的失效 mem_initzap_low_mappings kernel_physical_mapping_init 为便于说明问题,使用了2.2内核代码 2019/2/19 Linux OS Analysis

其他 关于cache 关于TLB 处于分页单元与MM之间 重写CR3,会导致TLB更新 2019/2/19 Linux OS Analysis

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