zoukankan      html  css  js  c++  java
  • vmalloc/vfree问题思考记录

    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!
  • 相关阅读:
    20190613 安装Anaconda
    20190613 一个SQL问题
    20190604 宠物引发的乱想
    windows下的vim打开文件乱码解决
    【题解】 「NOI2019」弹跳 KDT优化建图+最短路+剪枝+卡空间 LOJ3159
    【题解】 [AH/HNOI2017]单旋 LCT+splay
    【题解】 CF1400E Clear the Multiset 笛卡尔树+贪心+dp
    【题解】 CF1404C Fixed Point Removal 线段树+树状数组+带悔贪心
    【题解】 CF1251E2 Voting (Hard Version) 带悔贪心
    【题解】 CF1418G Three Occurrences hash+双指针+差分
  • 原文地址:https://www.cnblogs.com/zengjianrong/p/11886571.html
Copyright © 2011-2022 走看看