首页 > 其他分享 >持久映射&固定映射

持久映射&固定映射

时间:2023-10-08 16:24:21浏览次数:19  
标签:持久 高端 映射 KM 内存 固定 page

前言

Alt text

内核地址空间的划分

VMALLOC_STARTVMALLOC_END之间的区域用于vmalloc分配逻辑上连续物理上不连续的内存。

内核地址空间中还有一段区间用于高端内存的持久映射,PKMAP_BASEFIXADDR_START,如果存在高端内存可以通过alloc_pages_node分配高端内存,然后调用kmap在持久映射区建立映射关系。

持久映射和固定映射的区别与联系

好像vmalloc也可以实现分配高端内存然后建立虚拟地址与高端物理内存的映射,那持久映射还有什么意义呢?我个人认为,vmalloc为的是分配逻辑上连续物理上可不连续的大块内存,对于分配的内存是否是高端内存没有限制(尽管优先分配的是高端内存)。而持久映射只为访问高端内存,如果需要访问的总内存量超过vmalloc区域能够映射的范围,vmalloc不能够灵活访问所有的内存。因此通过alloc_pages_node自己申请一大片内存然后通过kamp的方式建立映射,这样才能够保证数据不丢的同时能访问所有的高端内存,毕竟vmallocvfree已经将从伙伴系统申请页帧的操作封装好了,没有机会自己管理页帧。

那固定映射有什么用呢?固定映射区域被划分为了per-cpu的多个子区域,每个子区域内部又划分为了多个固定用途的子项。子项的个数和用途在编译时就固定了,但是具体的映射关系是可改变的,这些固定的映射关系主要用于内核中需要建立到高端内存的映射同时又不能睡眠的场景,比如中断上下文。持久映射区的映射数量有限,因此当kmap发现无可用映射时就会陷入睡眠。而固定映射区的映射已经为每个cpu提前划分好了一部分,可以自由选择修改和使用哪一个映射,不会出现竞争导致睡眠的情况。

相关API

  • kmap: 接收page指针为参数,如果该page是高端内存时才会在持久映射区建立映射,因为持久映射区的范围有限,如果没有空闲地址时就会陷入睡眠,因此在不允许睡眠的场景无法使用。
  • kmap_atomic: 和kamp类似,接收一个page指针和km_type作为参数,但是kmap_atomic是原子的不会陷入睡眠,建立的映射位于固定映射区。

Note: 当系统中不存在高端内存时(现在很多64位系统都不存在高端内存)持久映射区,这些操作都没有意义,因为分配不出高端内存。如果将其他内存区的页帧作为参数,以上操作会直接返回线性映射的虚拟地址。

enum km_type {
    /* arch specific kmaps - change the numbers attached to these at your peril */
    __KM_CACHE,  /* cache flush page attachment point */
    __KM_PGD,  /* current page directory */
    __KM_ITLB_PTD,  /* current instruction TLB miss page table lookup */
    __KM_DTLB_PTD,  /* current data TLB miss page table lookup */

    /* general kmaps */
    KM_BOUNCE_READ,
    KM_SKB_SUNRPC_DATA,
    KM_SKB_DATA_SOFTIRQ,
    KM_USER0,
    KM_USER1,
    KM_BIO_SRC_IRQ,
    KM_BIO_DST_IRQ,
    KM_PTE0,
    KM_PTE1,
    KM_IRQ0,
    KM_IRQ1,
    KM_SOFTIRQ0,
    KM_SOFTIRQ1,
    KM_TYPE_NR
};

标签:持久,高端,映射,KM,内存,固定,page
From: https://www.cnblogs.com/wodemia/p/17749485.html

相关文章

  • kubernetes 持久化存储
    目录kubernetes持久化存储k8s存储介绍特地对象存储本地存储网络共享存储EmptyDir类型hostPath类型type类型说明持久化存储PV和PVCPV和PVC生命周期PV和PVC需要注意的地方pv资源清单PVC资源清单POD要挂载PVCwordpress完整综合实践mysqlwordpressmysql主从复制实......
  • 映射和函数
    设有非空集合X、Y及由X到Y的对应法则f,若对每个x属于X,存在唯一的y属于Y按f与之对应,则称f为X到Y的映射,记作f:X—>Y或y=f(x),x属于X。X为f的定义域,记作Df。f(x)={y|y=f(x),x属于Df}为f的值域,记作Rf。y=f(x)中,x为原像,y为像。注意1.X,Y不一定是数集,因为X可能是抽象的东西,Y也可能是抽象的东西,如X为全......
  • knative serving 域名映射
    创建应用hello-world.yamlapiVersion:serving.knative.dev/v1kind:Servicemetadata:name:helloworld-gonamespace:knative-demospec:template:spec:containers:-image:ghcr.dockerproxy.com/knative/helloworld-go:latestenv......
  • RedisStack部署/持久化/安全/与C#项目集成
    前言Redis可好用了,速度快,支持的数据类型又多,最主要的是现在可以用来向量搜索了。本文记录一下官方提供的redis-stack部署和配置过程。关于redis-stackredis-stackinstallsaRedisserverwithadditionaldatabasecapabilitiesandtheRedisInsight.redis提供了俩......
  • huoji69键盘的映射值
    先用xev程序获取按键的keycode的值,剩下的就是自己修改即可。修改.Xmodmap文件,内容为:1!keycode9=asciitildegrave2keycode9=asciitildegrave3!keycode66=Escape4keycode118=F12Insert5keycode119=F11Prior6keycode112=F10Next7keycode117=Delet......
  • Redis持久化
    前言​我们都知道Redis的数据都存在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证Redis的数据不会因为故障而丢失,这种机制就是Redis的持久化机制。​Redis的持久化机制主要是有两种,第一种是RDB快照,第二种是AOD日志。如果我们的服务器开启了AOF持久化功能,那么......
  • [架构之路-25]:目标系统 - 系统软件 - bootloader uboot内存映射与启动流程
    原文:https://blog.csdn.net/HiWangWenBing/article/details/127062057目录第1章uboot概述1.1概述1.2内存映射(案例)1.3uboot在嵌入式系统启动中的位置第2章uboot启动流程(源码分析)2.1入口函数:_start2.3执行流程(文字描述)2.4初始化过程第3章uboot如何加载内核3.1v......
  • ACCESS 报表分页-指定显示固定行数
    在报表中插入三个无关联的文本框控件,取名分别为Text,Text2,Text3,他们的宽/高,上/左边距按需求自定义,可见均设置为否,如果你需要显示序号的话,text3可设置为可见text 控件来源:=1text2:控件来源: =IIf([Text]<[Text3]+1,[Text],IIf(([Text]Mod[Text3])=0,[Text3],([Text......
  • CSS 实现 table 表头固定 tbody 显示垂直滚动条并自定义滚动条样式
    一、最终效果图 二、关键代码html代码:<divclass="table_info"><tableborder="0"cellspacing="0"cellpadding="0"style="width:100%;"><thead><tr><th>项目账号</th&g......
  • 映射和序列化
    映射数据库映射(ORM):将数据库表和对象模型之间进行映射,方便开发人员进行对象操作和数据库访问。优点是可以简化数据库操作、提高开发效率,缺点是对于复杂查询和性能要求较高的场景可能会有性能问题。适用于大部分需要与数据库打交道的应用场景。关系映射:将关系型数据库中的表和......