Linux内核进程管理进程切换之context_switch

本文介绍了Linux内核进程管理,特别是进程切换时的地址空间切换和寄存器、栈操作。在ARM64架构下,每个用户进程拥有独立的虚拟地址空间,内核地址空间则由所有进程共享。ASID用于避免页表切换时刷新TLB。代码分析部分详细讲解了不同场景下页表切换和寄存器栈切换的流程。
摘要由CSDN通过智能技术生成

基本概念


进程虚拟地址空间

ARM64的地址空间分配如下:

  • 用户地址空间
    0x0000000000000000–0000ffffffffffffffff
  • 内核地址空间
    0xffff000000000000–0xffffffffffffffff
    每一个用户进程拥有自己独立的用户地址空间,但内核地址空间只有一个,所有进程共用。

task_struct有两个成员mm和active_mm,用来描述进程的虚拟地址空间。对于用户进程来说,mm和active_mm是一致的,用来描述该进程的虚拟地址空间;对于内核进程来说,mm是NULL,因为内核进程使用统一的地址空间,active_mm借用用户进程的active_mm,至于为什么借用用户进程的active_mm暂时不得而知,后面搞清楚会补充进来。

ASID(Address Space ID)

进程切换的时候,有事会同时需要切换页表,对于ARM64来说,切换页表就是更新TTBR0,TTBR寄存器的第一如下:
在这里插入图片描述除了页表地址以外,还定义了ASID。之所以引入ASID,主要是为了避免在页表切换的时候刷掉TLB。页表会以缓存的形式存在TLB中,如果没有ASID,一旦页表切换,必须要刷掉TLB,因为MMU无法区分TLB中的转换表属于谁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值