本文介绍: 进程独有类型的 TLB:用户地址空间是每个进程独立的地址空间。从 prev 进程切换到next 进程时,TLB 中缓存的 prev 进程的相关数据对于 next 进程是无用的,因此可以刷新。是什么,它描述了一个进程切换时,CPU所需要保存的寄存器,也称为硬件上下文,ARM体系下的cpu_context保存了以下寄存器,将上次next进程保存的cpu_context的值。全局类型的 TLB:内核空间是所有进程共享的空间,因此这部分空间的虚拟地址到物园理地址的翻译是不会变化的,可以理解为全局的。
一. 概述
在最近初学ebpf时,使用到了挂载点finish_task_switch
统计内核线程的运行时间,遂进入内核源码对其进行学习分析。
finish_task_switch
在context_switch
被调用,其功能是完成进程切换的收尾工作,比如地址空间的清理。而context_switch
是进程切换的核心部分,其由两部分组成:
在分析这段源码之前,我们首先需要知道的是,context_switch( )函数建立next的地址空间。在task struct结构体中有这样两个字段:mm和active_mm。进程描述符的active_mm字段指向进程所使用的内存描述符,而mm字段指向进程所拥有的内存描述符。对于一般的进程,这两个字段有相同的地址,但是,内核线程没有它自己的地址空间而且它的 mm字段总是被设置为 NULL。
context_switch( )函数实现:如果next是一个内核线程,那么它使用prev所使用的地址空间。
二.switch_mm
进程地址空间ASID
三.switch_to
4.完成切换
5.进程切换调用图示
小结
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。