深入理解linux内核-内存寻址
逻辑地址:由一个段和偏移量组成的地址
线性地址(虚拟地址):
物理地址:CPU的物理地址线相对应的地址32或36位
多处理器系统中每个CPU对应一个GDT
局部线程存储:用于线程内部的各个函数调用都能访问、但其它线程不能访问的变量。
内存分页
页表、页目录包含字段:
present 1表示页表或页在主存中 0表示页表不在主存中或其他情况
field 包含物理地址的高位地址
accessed 1表示该页被访问过。进行页交换时使用
dirty (页表项)1表示被写过,进行页交换时使用
read/write 0只读 1可读写
user/supervisor 0只有内核态才能寻址 1都能寻址
pcd/pwd PCD 0表示开启高速缓存 1表示关闭高速缓存、PWD 0表示回写 1表示通写 (linux中总是开启高速缓存并且回写方式)
page size (页目录)1说明该页目录启用扩展分页功能(使用pagesize标 记为1表示产生缺页异常的原因不是因为缺页(应该是写时复制吧????))?????两种用法冲突?
global (页表)1说明该页为常用页,防止从TLB高速缓存中刷出去?????
present =0 pagesize=1预计是写时复制
present=0 dirty=1 非线性磁盘文件映射
32位分页:10+10+12
32位扩展分页(extended paging):10+22
物理地址扩展分页(PAE):
页表项64位 4K的页中包含512项2^9
pdpt+2+9+9+12
extended paging+PAE分页:pdpt+2+9+21
64位系统分页:
alpha:物理43 10+10+10+13
ia64:物理39 9+9+9+12
ppc64:物理41 10+10+9+12
sh64:物理41 10+10+9+12
x86_64:物理48 9+9+9+9+12
硬件高速缓存
缓存的最小单位是行。L1_CACHE_BYTES表示缓存行大小
假设高速缓存每个字有4字节,每行有4个字,每组有8行,两路组关联。
则高位地址用于验证是否缓存,地址bit[7:4]在组中选择行,地址bit[3:0]在行中选择字节。
并且指定内存行可以缓存在cache中的两个位置(两路)
直接映射:一个内存行只有一个可映射位置时(一路),容易造成内存颠簸
通写:既写高速缓存又写RAM
回写:只写高速缓存,只有CPU要求刷新高速缓存控制器时,才会写回RAM
linux对所有页都采用启用高速缓存,并且启动回写策略。
TLB(转换后援缓冲器)
每个CPU有自己的TLB
每次线性地址转换时,记录线性地址到物理地址的转换关系。下次转换时用于加速。
CPU间TLB项不必同步,因为不同进程的线性地址可能对应不同的物理地址。
提供的方法:
flush_tlb_all 刷新所有TLB表项(包括global标志表项) 改版内核页表项时
flush_tlb_kernel_range 刷新线性地址范围内的TLB(包括global标志表项) 更换一个范围内的内核页表项时
flush_tlb 刷新当前进程拥有的非全局TLB 进程切换时
flush_tlb_mm 刷新指定进程拥有的非全局TLB 创建新的子进程时
flush_tlb_range 刷新指定进程线性地址范围内的TLB 释放某个进程的特定线性地址空间时
flush_tlb_pgtables 刷新指定进程中特定的相邻页表集相关的TLB 释放进程的一些页表时
flush_tlb_page 刷新指定进程中单个页表项相关的TLB 处理缺页异常时
非全局TLB的刷新(用户态地址空间)
页表不同的两个普通进程切换时刷新
SMP架构下,两个CPU可能访问相同页表集,因此互相之间需要通知,但是在内核态时,可能没必要刷新TLB。
内核态时处于懒惰模式,所有对应TLB刷新操作都记录下来。只有当后续切换到这个页表集的用户态时才会应用该操作。(避免非必要的刷新操作)
记录的信息包括当前内存描述符、懒惰状态。每个内存描述符中记录所有使用该描述符的CPU下标。
懒惰模式的CPU收到该中断后清除对应自己CPU的下标:1。之后的内存描述符更新将不会通知该CPU。2。CPU切换到相同页表集也会刷新非全局TLB
全局TLB刷新???
线性地址字段
PAGE_SHIFT 页内偏移字段的位数
PAGE_MASK 获得对应地址的页首地址
PMD_SHIFT 页中间目录项可以映射区域大小的对数
PMD_MASK 获得页中间目录项对应的首地址
PUD_SHIFT 页上级目录项可以映射区域大小的对数
PUD_MASK 获得页上级目录项对应的首地址
PGDIR_SHIFT 页全局目录项可以映射区域大小的对数
PGDIR_MASK 获得页全局目录项对应的首地址
内核页表
内核有自己的页表,叫做主内核页全局目录
为系统中每一个普通进程对应的页全局目录项提供参考模型
??????????第八章”非线路内存区的线性地址“解释如何确保对主内核页全局目录的修改传递高进程实际的页全局目录中???????
临时内核页表
保证在保护模式下:线性地址0x00000000和0xc0000000都能映射到0x00000000物理地址
线性地址空间
|用户区|物理内存映射区|8M|vmalloc区|4k|vmalloc区|8k|永久内核映射|固定映射的线性地址|
|3G | 896M |8M|
几种情况下页表的创建????(小于896、大于4096)
固定映射的线性地址
该区域没有开启高速缓存(页PCD置位),并且线性地址和物理地址的映射关系是可以修改的,但特定线性地址用于什么功能是编译期固定的。
动态重映射
深入理解linux内核-内存寻址的更多相关文章
- 【读书笔记::深入理解linux内核】内存寻址【转】
转自:http://www.cnblogs.com/likeyiyy/p/3837272.html 我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0 ...
- 【读书笔记::深入理解linux内核】内存寻址
我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开 ...
- 读书笔记之Linux系统编程与深入理解Linux内核
前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...
- 《深入理解Linux内核》 读书笔记
深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样. ...
- 深入理解Linux中内存管理
前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...
- Linux内核内存管理算法Buddy和Slab: /proc/meminfo、/proc/buddyinfo、/proc/slabinfo
slabtop cat /proc/slabinfo # name <active_objs> <num_objs> <objsize> <objpersla ...
- linux内核内存分配(三、虚拟内存管理)
在分析虚拟内存管理前要先看下linux内核内存的具体分配我開始就是困在这个地方.对内核内存的分类不是非常清晰.我摘录当中的一段: 内核内存地址 ============================ ...
- Linux内核-内存回收逻辑和算法(LRU)
Linux内核内存回收逻辑和算法(LRU) LRU 链表 在 Linux 中,操作系统对 LRU 的实现主要是基于一对双向链表:active 链表和 inactive 链表,这两个链表是 Linux ...
- LINUX内核内存屏障
================= LINUX内核内存屏障 ================= By ...
随机推荐
- 自定义starter
https://github.com/deadzq/spring-boot-starter-hello 父子项目 子项目引用父项目中的依赖和配置参数
- Springboot @ConditionalOnProperty注解
最近看了一段代码其中用到了@ConditionalOnProperty注解,直接没有了解过这个注解,今天看到了顺便了解一下 具体代码如下 @Configuration public class Web ...
- 1059 Prime Factors(25 分)
Given any positive integer N, you are supposed to find all of its prime factors, and write them in t ...
- Java把多个list 合并成一个并去重
开发过程中遇到一个合并去重问题,任务完成后,总结出来一个比较简单的方法.对于List中不同类型的数据,需要采用不同的处理方式.List中如果是基础数据类型,直接合并去重即可:如果是对象类 ...
- CentOS7 升级Python2.x到3.x
CentOS 7 中默认安装了 Python,版本比较低(2.7.5),为了使用新版 3.x,需要对旧版本进行升级.由于很多基本的命令.软件包都依赖旧版本,比如:yum.所以,在更新 Python 时 ...
- Java学习日记基础篇(八) —— 二进制、位运算、位移运算
二进制 二进制是逢2进位的进位置,0,1是基本算符 原码反码补码 在基本数据类型那里,有详细解释 二进制的最高位数是符号位:0表示整数,1表示负数 正数的原码,反码,补码都一样 负数的反码 = 它的原 ...
- indexOf的用法
A.indexOf(B)="-1"表示的是不存在 不等于-1就表示存在 http://www.w3school.com.cn/jsref/jsref_indexOf.asp 没有出 ...
- 走进JavaWeb技术世界8:浅析Tomcat9请求处理流程与启动部署过程
谈谈 Tomcat 请求处理流程 转自:https://github.com/c-rainstorm/blog/blob/tomcat-request-process/reading-notes &l ...
- Buuctf pwn1 详细wp
目录 程序基本信息 程序溢出点 确定返回地址 编写exp脚本 成功getshell 程序基本信息 我们可以看到这是一个64程序,没有保护开启. 程序溢出点 gets函数可以读取无限字符,存在栈溢出. ...
- bagging,random forest,boosting(adaboost、GBDT),XGBoost小结
Bagging 从原始样本集中抽取训练集.每轮从原始样本集中使用Bootstraping(有放回)的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中).共进行 ...