arm linux的ASID (Address Space ID)
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)相关推荐
- Linux进程管理+内存管理:进程切换的TLB处理(ASID-address space ID、PCID-process context ID)
目录 一.前言 二.单核场景的工作原理 1.block diagram 2.绝对没有问题,但是性能不佳的方案 3.如何提高TLB的性能? 4.特殊情况的考量 4.进一步提升TLB的性能 - ASID( ...
- linux qemu 报错 Unable to reserve 0xfffff000 bytes of virtual address space at 0x1000 解决方法
目录 错误现象 可能原因 解决过程 解决方法 错误现象 使用 qemu-i686 运行 i686平台文件 报错 qemu-i686: Unable to reserve 0xfffff000 byte ...
- arm linux s文件夹,armv7对应的CACHE操作相关文件解析
最近在使用TI的DRA726芯片.A15端需要访问图像,而图像是在外设空间的,用DMA拷贝到CACHE空间. 这样就导致了DMA的CACHE一致性的问题,需要在DMA之后清除所使用图像空间的数据CAC ...
- ARM linux的启动部分源代码简略分析
ARM linux的启动部分源代码简略分析 以友善之臂的mini2440开发板为平台,以较新的内核linux-2.6.32.7版本为例,仅作说明之用. 当内核映像被加载到RAM之后,Bootloade ...
- ARM linux的启动部分源代码简略分析【转】
转自:http://www.cnblogs.com/armlinux/archive/2011/11/07/2396784.html ARM linux的启动部分源代码简略分析 以友善之臂的mini2 ...
- linux运行欧陆风云,Arm linux启动分析(1)
下周准备做linux启动的技术讲座,在这里我慢慢整理下自己的材料,这次我写的是Image的启动过程,也即使zImage解压缩结束后的启动代码,这时候的代码开始地址仍然是0x30008000,下面我结合 ...
- ARM linux解析之压缩内核zImage的启动过程
ARM linux解析之压缩内核zImage的启动过程 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s 和解压代码misc.c,deco ...
- arm linux内核启动过程,ARM64的启动过程之(一):内核第一个脚印
ARM64的启动过程之(一):内核第一个脚印 作者:linuxer 发布于:2015-10-10 15:06 分类:ARMv8A Arch 一.前言 kernel的整个启动过程涉及的内容很多,不可能每 ...
- arm linux kernel 从入口到start_kernel 的代码分析
Linux系统启动过程分析(主要是加载内核前的动作) 经过对Linux系统有了一定了解和熟悉后,想对其更深层次的东西做进一步探究.这当中就包括系统的启动流程.文件系统的组成结构.基于动态库和静态库的程 ...
最新文章
- lgg6 android 9,【LGG6评测】18:9奇葩比例没采用骁龙835 LG G6解析_LG G6_手机评测-中关村在线...
- python数据结构之栈
- 本地java判断zk节点是否存在
- margin background_div盒子的外部距离(margin)【202】。
- WIN10升级的做法有待友好设计
- 【图像分割】基于matlab GUI遗传算法Otsu图像分割【含Matlab源码 734期】
- 如何使用Bootbox
- 科普:股票价格为什么会高开?
- 重磅出炉!KCon 黑客大会 2019 演讲议题正式公布
- 新手怎么做直播卖货?都有哪些卖货成交话术技巧?
- Window10 系统 把图片制作成视频
- Flutter Ink,InkWell,InkResponse水波纹实现(2.3)
- 边缘计算(雾计算)——AI+IoT的热词
- 2014、2015年国家级虚拟仿真实验教学中心入选名单
- 【WINDOWS / DOS 批处理】if命令实现逻辑运算符
- ripro主题后台Jsdelivr CDN 加速服务挂了的临时解决方案。
- 如何高效定义和验证restful请求的参数
- netty 通道配置接口定义
- 会场安排问题(贪心法)
- 视频教程-PHP快速入门视频课程(通俗易懂)【2019版】-PHP
热门文章
- 【STM32】7—通用定时器 时钟树学习
- 传导干扰测试(0.15~30MHz)
- CSS------伪类(:first)和伪元素(::after)汇总以及区别分析
- ghost里html文件怎么打开,Ghost配置5——添加归档页面
- html5调用720全景,霸屏朋友圈的720°全景H5,你一样可以做
- 传智黑马java基础学习——day02(变量、运算符)
- 软博会亮点纷呈: 宝德大数据一体机随太极惊艳亮相引关注
- 谷粒商城 (二十八) --------- 仓储服务 API 仓库管理
- 跨境网络赌博“易倍”被端 赌资21亿元均进入第三方支付后“漂白”
- 最新网络安全工程师从入门到精通学习_网络安全入门