逻辑地址:由一个段和偏移量组成的地址
线性地址(虚拟地址):
物理地址: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内核-内存寻址的更多相关文章

  1. 【读书笔记::深入理解linux内核】内存寻址【转】

    转自:http://www.cnblogs.com/likeyiyy/p/3837272.html 我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0 ...

  2. 【读书笔记::深入理解linux内核】内存寻址

    我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开 ...

  3. 读书笔记之Linux系统编程与深入理解Linux内核

    前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...

  4. 《深入理解Linux内核》 读书笔记

    深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样. ...

  5. 深入理解Linux中内存管理

    前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...

  6. Linux内核内存管理算法Buddy和Slab: /proc/meminfo、/proc/buddyinfo、/proc/slabinfo

    slabtop cat /proc/slabinfo # name <active_objs> <num_objs> <objsize> <objpersla ...

  7. linux内核内存分配(三、虚拟内存管理)

    在分析虚拟内存管理前要先看下linux内核内存的具体分配我開始就是困在这个地方.对内核内存的分类不是非常清晰.我摘录当中的一段: 内核内存地址 ============================ ...

  8. Linux内核-内存回收逻辑和算法(LRU)

    Linux内核内存回收逻辑和算法(LRU) LRU 链表 在 Linux 中,操作系统对 LRU 的实现主要是基于一对双向链表:active 链表和 inactive 链表,这两个链表是 Linux ...

  9. LINUX内核内存屏障

    =================                          LINUX内核内存屏障                          ================= By ...

随机推荐

  1. Codeforces Round #591

    目录 Contest Info Solutions A. Save the Nature B. Sequence Sorting C. Paint the Tree D. Stack Extermin ...

  2. Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)

    Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...

  3. linux 安装nginx(转)

    转自https://www.cnblogs.com/xiaochongc/p/11527492.html 步骤: 1. 安装所需环境 a)安装gcc:安装 nginx 需要先将官网下载的源码进行编译, ...

  4. Linux之jq

    什么是jq?jq是Linux下面把文本字符串格式化成json格式的工具 系统环境:centos 7 一.安装 (1)yum安装 a.安装epel源 # wget http://dl.fedorapro ...

  5. wireshark新手导航

    本篇教你如何开始使用Wireshark.开始本篇之前,请先已经安装完wireshark 3.0.0. 初始界面 启动wireshark,可以看到程序界面主要由以下几部分组成: 窗口标题-window ...

  6. 个人学习分布式专题(二)分布式服务治理之Dubbo框架

    目录 Dubbo框架 1.1 Dubbo是什么 1.2 Dubbo企业级应用示例(略) 1.3 Dubbo实现原理及架构剖析 1.4 Dubbo+Spring集成 Dubbo框架 1.1 Dubbo是 ...

  7. window.postMessage 跨窗口,跨iframe javascript 通信

    同源通信 执行它们的页面位于具有相同的协议(http/https),端口(80/443),主机(通常为域名) 时,这两个脚本才能相互通信 大多数情况下,网站就是内部的域名,所以是同源通信,可以相互访问 ...

  8. 如何用Deepin-wine安装运行win32的程序

    创建容器 容器就是win32程序运行的环境,可以理解为一个极小的windows,在Linux下面实际对应一个文件目录,如QQ对应的容器目录是~/.deepinwine/Deepin-QQ. 创建容器最 ...

  9. Python 自学笔记(六)

    PK小游戏 1.要有玩家敌人:那就是需要定义两个角色的属性变量 2.相互攻击:需要两个角色都有血量和攻击的变量(也就是四个变量) 3.攻击减少血量:比如玩家血量=敌人攻击力-玩家当前血量 4.最终胜负 ...

  10. 微信小程序之圆形进度条(自定义组件)

    思路 使用2个canvas 一个是背景圆环,一个是彩色圆环. 使用setInterval 让彩色圆环逐步绘制. 在看我的文章前,必须先看 ,下面转的文章,因为本文是在它们基础上修改的. 它们的缺点为: ...