深入理解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对所有页都采用启用高速缓存,并且启动回写策略。

每个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 处理缺页异常时

页表不同的两个普通进程切换时刷新

SMP架构下,两个CPU可能访问相同页表集,因此互相之间需要通知,但是在内核态时,可能没必要刷新TLB。

内核态时处于懒惰模式,所有对应TLB刷新操作都记录下来。只有当后续切换到这个页表集的用户态时才会应用该操作。(避免非必要的刷新操作)

记录的信息包括当前内存描述符、懒惰状态。每个内存描述符中记录所有使用该描述符的CPU下标。

懒惰模式的CPU收到该中断后清除对应自己CPU的下标:1。之后的内存描述符更新将不会通知该CPU。2。CPU切换到相同页表集也会刷新非全局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|

该区域没有开启高速缓存(页PCD置位),并且线性地址和物理地址的映射关系是可以修改的,但特定线性地址用于什么功能是编译期固定的。

Original: https://www.cnblogs.com/fanguang/p/8641505.html
Author: 反光
Title: 深入理解linux内核-内存寻址

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578097/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Ubuntu系统报错The system is running in low-graphics mode

    我遇到过两次这种请况,这次解决了。很nice! 在csdn上搜到的大部分操作是: 鼠标进入系统 使用快捷键 Ctrl+Alt+F1 进入用户 输入密码 然后按照以下代码进行 cd …

    Linux 2023年5月27日
    0120
  • 一面数据: Hadoop 迁移云上架构设计与实践

    背景 一面数据创立于 2014 年,是一家领先的数据智能解决方案提供商,通过解读来自电商平台和社交媒体渠道的海量数据,提供实时、全面的数据洞察。长期服务全球快消巨头(宝洁、联合利华…

    Linux 2023年6月14日
    0148
  • Springboot集成Redis举例

    依赖包 配置文件(application.properties) 配置文件(RedisConfig.java) import com.fasterxml.jackson.annot…

    Linux 2023年5月28日
    0110
  • 使用URL快捷方式提高效率

    阅文时长 | 0.9分钟字数统计 | 1453.6字符主要内容 | 1、引言&背景 2、URL格式基本格式介绍 3、附录:Hotkey详细参数 4、拓展:收藏夹中的URL格…

    Linux 2023年6月14日
    0109
  • Nginx—location配置

    Nginx—location配置 编辑nginx.conf文件 #user nobody; worker_processes 1; #error_log logs/error.lo…

    Linux 2023年6月11日
    0104
  • k8s/kubeadm 生产环境高可用集群部署

    kubeadm 生产环境集群部署 基本环境配置 kubeadm 安装方式自 1.14 版本以后,安装方法几乎没有任何变化,此文档可以尝试安装最新的 k8s 集群, centos 采…

    Linux 2023年6月14日
    0106
  • Shell命令

    1.shell命令的执行机制:fork+exec执行命令(任何的shell都会执行) 2.shell中的用户输入处理 1 命令行参数:选项、参数 2 运行时输入 3 read命令:…

    Linux 2023年6月6日
    0110
  • 网络扫描(一)

    使用工具:Kali Linux、Metaspoliatable(作为攻击目标) 扫描的4个不同阶段 用ping验证系统是否正在运行。 用Nmap扫描目标主机的端口。 用Nmap脚本…

    Linux 2023年6月14日
    0128
  • python接收微信消息报’HTMLParser’ object has no attribute ‘unescape’错误

    我的博客 一直有个想法,想要弄个微信机器人,然而出师不利,刚开始就碰壁了 先上代码,这个是用来接收消息的,是个测试脚本 #!/usr/bin/python coding: utf-…

    Linux 2023年6月6日
    0124
  • 【转载】技术研究和个人成长方法

    TK 教主 16 年在腾讯内部的一个分享,讲述安全研究者的个人成长。虽然分享的内容是关于安全研究领域,但我相信对各个领域的学习成长是相同的。这里记录如下: 个人成长 确立个人方向,…

    Linux 2023年6月13日
    0101
  • 到底什么是TORCH.NN?

    该教程是在notebook上运行的,而不是脚本,下载notebook文件。 PyTorch提供了设计优雅的模块和类: torch.nn, torch.optim, Dataset,…

    Linux 2023年6月14日
    0118
  • WPF 应用启动过程同时启动多个 UI 线程且访问 ContentPresenter 可能让多个 UI 线程互等

    在应用启动过程里,除了主 UI 线程之外,如果还多启动了新的 UI 线程,且此新的 UI 线程碰到 ContentPresenter 类型,那么将可能存在让新的 UI 线程和主 U…

    Linux 2023年6月6日
    0106
  • 5.9 Linux Vim批量注释和自定义注释

    使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符 #再退回命令模式,非常麻烦。 连续行的注释其实可以用替换命令来完…

    Linux 2023年6月7日
    097
  • Redis做Mybatis的二级缓存

    基于spring boot项目的前提下,使用redis数据库做mybatis的二级缓存。 Redis做mybatis的二级缓存 作用提升速度,保证多台服务器访问同一数据库时不会崩注…

    Linux 2023年6月7日
    0134
  • 版本控制gitlab

    版本控制gitlab 版本控制gitlab 什么是版本控制gitlab gitlab部署 什么是版本控制gitlab GitLab 是一个用于仓库管理系统的开源项目,使用Git作为…

    Linux 2023年6月6日
    0121
  • 【设计模式】Java设计模式-单例模式

    【设计模式】Java设计模式 – 单例模式 😄 不断学习才是王道🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🌝分享学习心得,欢迎指正,大家一起学习…

    Linux 2023年6月6日
    0172
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球