1. arm 32 用户进程陷入内核态通过vmalloc/vfree分配内存的流程

    • 内核在更新非连续内存区对应的页表项是非常懒惰的。--《深入理解linux内核》
    • arm 32 只有一个PGD 寄存器,即每个进程的内核态和用户态是共享一份PGD,不同于内核主页表
    • vmalloc分配内存时,实际是将物理内存映射到内核的主页表(即init_task的页表);
    • 当用户进程访问vmalloc内存时,触发vmalloc fault,同步init_task的vmalloc一级页表到进程PGD,即vmalloc的二级页表,大家都是共用一份的;
    • 当第二用户进程访问vmalloc内存,同上;
    • 当用户进程vfree时,实际是将物理内存释放,同时释放二级页表,以及将init_task的vmalloc一级页表置0;
    • 当第二个用户进程继续访问vmalloc内存时,触发vmalloc transaction fault(二级页表异常),此时由于init_task并无此二级页表,无法同步,故panic。
  2. arm 64 vmalloc/vfree流程
    • arm 64 有两个PGD 寄存器,其中一个存放用户态的PGD,一个存放内核态的PGD(即init_task的PGD,整个内核空间只有一个PGD);
    • 由于大家都是共用一个PGD,就无所谓的vamlloc fault了,流程也简单明了了
  3. 问题引申
    • copy_from_usr/copy_to_usr在arm 32如何实现?

      • arm 32由于内核态用户态共用一个PGD;
      • 当user pointer的物理内存已经分配,通过简单的copy即可;
      • 但若还未分配user pointer 的物理内存呢?如何处理?
    • copy_from_usr/copy_to_usr在arm 64如何实现?
      • 由于ARM64的硬件特殊设计,有两个页表基地址寄存器ttbr0_el1和ttbr1_el1。处理器根据64 bit地址的高16 bit判断访问的地址属于用户空间还是内核空间。如果是用户空间地址则使用ttbr0_el1,反之使用ttbr1_el1。因此,ARM64进程切换的时候,只需要改变ttbr0_el1的值即可。ttbr1_el1可以选择不需要改变,因为所有的进程共享相同的内核空间地址。
    • arm 32理论上来讲也是可以实现用户态一个PGD,内核态一个PGD,只需要在每次状态切换时更新PGD即可,那为何不这么做呢?
    • 切换PGD,引起TLB 抖动,如何减少 TLB 抖动?答案是TLB ASID!

vmalloc/vfree问题思考记录的更多相关文章

  1. kmalloc/kfree,vmalloc/vfree函数用法和区别

    http://blog.csdn.net/tigerjibo/article/details/6412881 kmalloc/kfree,vmalloc/vfree函数用法和区别 1.kmalloc ...

  2. Linux内存管理 (6)vmalloc

    专题:Linux内存管理专题 关键词:vmalloc.页对齐.虚拟地址连续.物理不连续 至此,已经介绍了集中内核中内存分配函数,在开始简单做个对比总结Linux中常用内存分配函数的异同点,然后重点介绍 ...

  3. 【原创】(十二)Linux内存管理之vmap与vmalloc

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  4. Memory Allocation API In Linux Kernel && Linux Userspace、kmalloc vmalloc Difference、Kernel Large Section Memory Allocation

    目录 . 内核态(ring0)内存申请和用户态(ring3)内存申请 . 内核态(ring0)内存申请:kmalloc/kfree.vmalloc/vfree . 用户态(ring3)内存申请:mal ...

  5. x1c2017 8G版 win linux的取舍纠结记录

    x1c 2017 的 i5 7200U 8G ram 的丐版.换了1T SSD.其实一般使用没啥问题. 1 外出携带的轻便性太满意(mac13寸相比之下都太重了): 2 coding时候的安静性,比原 ...

  6. 【导航】JennyHui 老白兔记录贴

    英语控 TED X - > 笔记 程序媛 2019-08-24 Java学习路径规划 思考记录 2018-08-24 常见的工作思考方式 浪费时间 百家讲坛 开卷八分钟

  7. [技术干货-算子使用] Mindspore 控制流中存在原地更新操作类副作用算子时循环值不更新问题记录

    关于mindspore 原地更新类算子的一点思考记录如下: 现象记录: 原始测试代码 错误结果复现: 分析: 如果在场景中加入42行的copy()操作此时cpu的结果就会正确,但是gpu的结果则不受c ...

  8. 深入理解Linux内存分配

    深入理解Linux内存分配 为了写一个用户层程序,你也许会声明一个全局变量,这个全局变量可能是一个int类型也可能是一个数组,而声明之后你有可能会先初始化它,也有可能放在之后用到它的时候再初始化.除此 ...

  9. Linux 内存布局

         本文主要简介在X86体系结构下和在ARM体系结构下,Linux内存布局的概况,力求简单明了,不过多深入概念,多以图示的方式来记忆理解,一图胜万言. Technorati 标签: 内存 布局 ...

随机推荐

  1. JavaScript数组去重(12种方法,史上最全)

    参考博客:https://segmentfault.com/a/1190000016418021?utm_source=tag-newest

  2. 6种微服务RPC框架,你知道几个?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...

  3. angular实现draggable拖拽

    前言:最近项目要实现一个拖拽功能,我在网上开始了各类搜寻,虽然后面因为数据原因舍弃了拖拽的这一需求,但是为了不辜负最近的研究,还是来记录一下. 场景需求:面试预约选时间节点,候选人之间是可以相互交换的 ...

  4. doGet()方法和doPost()方法有什么区别?

    1. 一般上,get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.pos ...

  5. 《Java基础知识》Java final关键字:阻止继承和多态

    在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有“终态”的特征,表示“最终的”意思.具体规定如下: final 修饰的类不能被继承. final ...

  6. Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)

    leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三 ...

  7. dotnetcore执行shell脚本

    我们可以使有dotnetcore跨平台的特性,优雅的实现在dotnetcore执行shell (bash).  代码如下: using System; using System.Collections ...

  8. RAC修改字符集

    字符集修改做过几次了,这次感觉还是有点不顺,走了弯路,再记一遍[概况]准备搭建RAC+RAC DG,发现两端字符集不大一致,担心到时出问题. [目标]将备库NLS_NCHAR_CHARACTERSET ...

  9. 微软与阿里云合作推出“开放应用模型(OAM)”

    英文原文:Announcing the Open Application Model (OAM) 原文标题:微软与阿里云合作推出“开放应用模型(OAM)” 用于 Kubernetes 及更多平台的应用 ...

  10. js 五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解

     壹 ❀ 引 可以说this与闭包.原型链一样,属于JavaScript开发中老生常谈的问题了,百度一搜,this相关的文章铺天盖地.可开发好几年,被几道this题安排明明白白的人应该不在少数(我就是 ...