http://blog.163.com/awaken_ing/blog/static/1206131972015112011286335

平台:ARM Versatile Express for Cortex-A9 (ARMv7) 
# CONFIG_ARM_LPAE is not set, 也就是使用Short-descriptor格式, ASID存储在CONTEXTIDR的低8 bit:

31                         7          0
+-------------------------+-----------+
|      PROCID             |   ASID    |
+-------------------------+-----------+

页表项中 nG == 1时, 这个页表项信息就是 non-global, 或者说 process-specific, 对应的TLB中就会有ASID信息, 执行虚拟地址到物理地址转换时, ASID也需要参与该过程.

用户地址空间的页表才会设置nG标志 (内核地址的一部分地址范围使用TLB lockdown比较合适): 
linux-3.10.86/arch/arm/include/asm/pgtable.h

static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pteval)
{
...if (addr < TASK_SIZE && pte_present_user(pteval)) {
... ext |= PTE_EXT_NG; }
... set_pte_ext(ptep, pteval, ext);
}

set_pte_at -> set_pte_ext -> cpu_v7_set_pte_ext

arm linux中通过设置CONTEXTIDR, 进而设置ASID, 相关代码为: 
linux-3.10.86/arch/arm/mm/proc-v7-2level.S

ENTRY(cpu_v7_switch_mm)
...
mcr    p15, 0, r1, c13, c0, 1        @ set context ID

调用关系为: 
context_switch() ->switch_mm() -> check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk) -> cpu_switch_mm() -> cpu_v7_switch_mm(pgd_t * pgd, struct mm_struct *mm) 
linux把ASID存储在mm->context.id的低8位 (D7:D0).

新创建的非内核线程 (内核线程不会调用到dup_mm), 初始化ASID为0: 
copy_mm -> dup_mm -> init_new_context 
#define init_new_context(tsk,mm)   ({ atomic64_set(&mm->context.id, 0); 0; }) 
到上下文切换的时候才真正开始给ASID赋值, 并设置CONTEXTIDR寄存器.

有分配, 就该有回收, 这也是使用bitmap来管理ASID, 而不是asid++的方式的原因. ASID的分配是通过bitmap变量asid_map来记录的. set bit的操作在new_context()中可以找到. 查找对该变量的clear bit操作, 进程退出时, 本应有该动作(清asid_map中该进程所对应的bit), 但很遗憾, 没有找到, 开发人员偷懒了?

由于ASID只有8bit, 范围为0~0xff, 当这些值分配完后, 就需要flush TLB, 同时对generation加1, 然后重新开始分配ASID. generation为mm->context.id的高24+32位(D63:D8), 这样, 后续再调度到这个进程时, 就可以通过判断generation是否变化了, 来知道 mm->context.id中的ASID是否还有效.

arm linux的ASID (Address Space ID)相关推荐

  1. Linux进程管理+内存管理:进程切换的TLB处理(ASID-address space ID、PCID-process context ID)

    目录 一.前言 二.单核场景的工作原理 1.block diagram 2.绝对没有问题,但是性能不佳的方案 3.如何提高TLB的性能? 4.特殊情况的考量 4.进一步提升TLB的性能 - ASID( ...

  2. linux qemu 报错 Unable to reserve 0xfffff000 bytes of virtual address space at 0x1000 解决方法

    目录 错误现象 可能原因 解决过程 解决方法 错误现象 使用 qemu-i686 运行 i686平台文件 报错 qemu-i686: Unable to reserve 0xfffff000 byte ...

  3. arm linux s文件夹,armv7对应的CACHE操作相关文件解析

    最近在使用TI的DRA726芯片.A15端需要访问图像,而图像是在外设空间的,用DMA拷贝到CACHE空间. 这样就导致了DMA的CACHE一致性的问题,需要在DMA之后清除所使用图像空间的数据CAC ...

  4. ARM linux的启动部分源代码简略分析

    ARM linux的启动部分源代码简略分析 以友善之臂的mini2440开发板为平台,以较新的内核linux-2.6.32.7版本为例,仅作说明之用. 当内核映像被加载到RAM之后,Bootloade ...

  5. ARM linux的启动部分源代码简略分析【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/11/07/2396784.html ARM linux的启动部分源代码简略分析 以友善之臂的mini2 ...

  6. linux运行欧陆风云,Arm linux启动分析(1)

    下周准备做linux启动的技术讲座,在这里我慢慢整理下自己的材料,这次我写的是Image的启动过程,也即使zImage解压缩结束后的启动代码,这时候的代码开始地址仍然是0x30008000,下面我结合 ...

  7. ARM linux解析之压缩内核zImage的启动过程

    ARM linux解析之压缩内核zImage的启动过程 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s 和解压代码misc.c,deco ...

  8. arm linux内核启动过程,ARM64的启动过程之(一):内核第一个脚印

    ARM64的启动过程之(一):内核第一个脚印 作者:linuxer 发布于:2015-10-10 15:06 分类:ARMv8A Arch 一.前言 kernel的整个启动过程涉及的内容很多,不可能每 ...

  9. arm linux kernel 从入口到start_kernel 的代码分析

    Linux系统启动过程分析(主要是加载内核前的动作) 经过对Linux系统有了一定了解和熟悉后,想对其更深层次的东西做进一步探究.这当中就包括系统的启动流程.文件系统的组成结构.基于动态库和静态库的程 ...

最新文章

  1. lgg6 android 9,【LGG6评测】18:9奇葩比例没采用骁龙835 LG G6解析_LG G6_手机评测-中关村在线...
  2. python数据结构之栈
  3. 本地java判断zk节点是否存在
  4. margin background_div盒子的外部距离(margin)【202】。
  5. WIN10升级的做法有待友好设计
  6. 【图像分割】基于matlab GUI遗传算法Otsu图像分割【含Matlab源码 734期】
  7. 如何使用Bootbox
  8. 科普:股票价格为什么会高开?
  9. 重磅出炉!KCon 黑客大会 2019 演讲议题正式公布
  10. 新手怎么做直播卖货?都有哪些卖货成交话术技巧?
  11. Window10 系统 把图片制作成视频
  12. Flutter Ink,InkWell,InkResponse水波纹实现(2.3)
  13. 边缘计算(雾计算)——AI+IoT的热词
  14. 2014、2015年国家级虚拟仿真实验教学中心入选名单
  15. 【WINDOWS / DOS 批处理】if命令实现逻辑运算符
  16. ripro主题后台Jsdelivr CDN 加速服务挂了的临时解决方案。
  17. 如何高效定义和验证restful请求的参数
  18. netty 通道配置接口定义
  19. 会场安排问题(贪心法)
  20. 视频教程-PHP快速入门视频课程(通俗易懂)【2019版】-PHP

热门文章

  1. 【STM32】7—通用定时器 时钟树学习
  2. 传导干扰测试(0.15~30MHz)
  3. CSS------伪类(:first)和伪元素(::after)汇总以及区别分析
  4. ghost里html文件怎么打开,Ghost配置5——添加归档页面
  5. html5调用720全景,霸屏朋友圈的720°全景H5,你一样可以做
  6. 传智黑马java基础学习——day02(变量、运算符)
  7. 软博会亮点纷呈: 宝德大数据一体机随太极惊艳亮相引关注
  8. 谷粒商城 (二十八) --------- 仓储服务 API 仓库管理
  9. 跨境网络赌博“易倍”被端 赌资21亿元均进入第三方支付后“漂白”
  10. 最新网络安全工程师从入门到精通学习_网络安全入门