内核页表和进程页表
来源:互联网 发布:奇 视频编辑软件 编辑:程序博客网 时间:2024/05/16 07:55
初学内核时,经常被“内核页表”和“进程页表”搞晕,不知道这到底是个啥东东,跟我们平时理解的页表有和关系。。
内核页表:即书上说的主内核页表,在内核中其实就是一段内存,存放在主内核页全局目录init_mm.pgd(swapper_pg_dir)中,硬件并不直接使用。
进程页表:每个进程自己的页表,放在进程自身的页目录task_struct.pgd中。
在保护模式下,从硬件角度看,其运行的基本对象为“进程”(或线程),而寻址则依赖于“进程页表”,在进程调度而进行上下文切换时,会进行页表的切换:即将新进程的pgd(页目录)加载到CR3寄存器中。从这个角度看,其实是完全没有用到“内核页表”的,那么“内核页表”有什么用呢?跟“进程页表”有什么关系呢?
1、内核页表中的内容为所有进程共享,每个进程都有自己的“进程页表”,“进程页表”中映射的线性地址包括两部分:
用户态
内核态
其中,内核态地址对应的相关页表项,对于所有进程来说都是相同的(因为内核空间对所有进程来说都是共享的),而这部分页表内容其实就来源于“内核页表”,即每个进程的“进程页表”中内核态地址相关的页表项都是“内核页表”的一个拷贝。
2、“内核页表”由内核自己维护并更新,在vmalloc区发生page fault时,将“内核页表”同步到“进程页表”中。以32位系统为例,内核页表主要包含两部分:
线性映射区
vmalloc区
其中,线性映射区即通过TASK_SIZE偏移进行映射的区域,对32系统来说就是0-896M这部分区域,映射对应的虚拟地址区域为TASK_SIZE-TASK_SIZE+896M。这部分区域在内核初始化时就已经完成映射,并创建好相应的页表,即这部分虚拟内存区域不会发生page fault。
vmalloc区,为896M-896M+128M,这部分区域用于映射高端内存,有三种映射方式:vmalloc、固定、临时,这里就不像述了。。
以vmalloc为例(最常使用),这部分区域对应的线性地址在内核使用vmalloc分配内存时,其实就已经分配了相应的物理内存,并做了相应的映射,建立了相应的页表项,但相关页表项仅写入了“内核页表”,并没有实时更新到“进程页表中”,内核在这里使用了“延迟更新”的策略,将“进程页表”真正更新推迟到第一次访问相关线性地址,发生page fault时,此时在page fault的处理流程中进行“进程页表”的更新
内核页表:即书上说的主内核页表,在内核中其实就是一段内存,存放在主内核页全局目录init_mm.pgd(swapper_pg_dir)中,硬件并不直接使用。
进程页表:每个进程自己的页表,放在进程自身的页目录task_struct.pgd中。
在保护模式下,从硬件角度看,其运行的基本对象为“进程”(或线程),而寻址则依赖于“进程页表”,在进程调度而进行上下文切换时,会进行页表的切换:即将新进程的pgd(页目录)加载到CR3寄存器中。从这个角度看,其实是完全没有用到“内核页表”的,那么“内核页表”有什么用呢?跟“进程页表”有什么关系呢?
1、内核页表中的内容为所有进程共享,每个进程都有自己的“进程页表”,“进程页表”中映射的线性地址包括两部分:
用户态
内核态
其中,内核态地址对应的相关页表项,对于所有进程来说都是相同的(因为内核空间对所有进程来说都是共享的),而这部分页表内容其实就来源于“内核页表”,即每个进程的“进程页表”中内核态地址相关的页表项都是“内核页表”的一个拷贝。
2、“内核页表”由内核自己维护并更新,在vmalloc区发生page fault时,将“内核页表”同步到“进程页表”中。以32位系统为例,内核页表主要包含两部分:
线性映射区
vmalloc区
其中,线性映射区即通过TASK_SIZE偏移进行映射的区域,对32系统来说就是0-896M这部分区域,映射对应的虚拟地址区域为TASK_SIZE-TASK_SIZE+896M。这部分区域在内核初始化时就已经完成映射,并创建好相应的页表,即这部分虚拟内存区域不会发生page fault。
vmalloc区,为896M-896M+128M,这部分区域用于映射高端内存,有三种映射方式:vmalloc、固定、临时,这里就不像述了。。
以vmalloc为例(最常使用),这部分区域对应的线性地址在内核使用vmalloc分配内存时,其实就已经分配了相应的物理内存,并做了相应的映射,建立了相应的页表项,但相关页表项仅写入了“内核页表”,并没有实时更新到“进程页表中”,内核在这里使用了“延迟更新”的策略,将“进程页表”真正更新推迟到第一次访问相关线性地址,发生page fault时,此时在page fault的处理流程中进行“进程页表”的更新
0 0
- 内核页表和进程页表
- 内核页表和进程页表
- 内核页表和进程页表
- 关于进程页表内核部分和内核主页表的关系(Linux 2.6.11)
- 关于内核页表和进程页表的一个问题
- 进程的页表和页目录存储在内核空间还是用户空间?低端内存还是高端内存
- 内核中的进程管理部分2-pidhash和链表
- linux进程创建与守护;exec 进程内核页表建立
- linux进程创建与守护;exec 进程内核页表建立
- MINIX 3内核进程表
- 关于进程页表和页目录是存放在内核空间,还是用户空间,低端还是高端内存的思考和验证
- 进程页表与内核页表:页表的初始化
- 关于内核进程0和进程1
- 关于内核进程0和进程1
- 关于内核进程0和进程1
- 内核对象和进程基础
- linux内核线程和进程
- 进程栈和内核栈
- JavaScript对HTML DOM 的操作简述
- Mac及Windows系统下 eclipse neon安装svn插件遇见的问题及其解决方案
- 将cocos2dx项目工程移植到eclipse中编译打包APK
- 德州仪器面试
- 建议104:用多态代替条件语句
- 内核页表和进程页表
- android UDID获取:android 设备SN的获取 续 android 设备唯一码的获取,Cpu号,Mac地址
- 架构设计:远程调用服务架构设计及zookeeper技术详解(上篇)
- 函数说明 getopt()用来分析命令行参数
- 运算符&&表达式
- 142.O(1) Check Power of 2-O(1)时间检测2的幂次(容易题)
- 建造者模式学习笔记
- ORA-00020、无法使用sys用户登录系统。
- 矩阵的运算 Matrix Operations