linux - Linux内核中ASID用完了怎么处理?

标签 linux kernel arm

ARM架构中的ASID(the Address Space Identifier)在一个寄存器中占用8位。这意味着可以分配 256 个 ASID。但是在 linux 内核中甚至有超过 1024 个任务可以同时运行。 Linux内核中ASID用完了怎么处理? 我查过内核源码,当ASID用完后,内核会重新分配ASID给新任务。考虑一种情况,最新的任务拥有第一个 ASID(0b1000 0000 0000 0001),但必须有一个任务已经拥有相同的 ASID。如果这两个任务需要 cantext switch 怎么办?我没有找到相关的内核源代码。 linux内核相关代码在~/kernel/core.c context_switch() 中。如有回复将不胜感激,在此先谢过

最好的问候。 苍鹭

最佳答案

我找到了一些说明,如下所示(Cortex -A9 程序员指南 P8-20): ASID 是动态分配的,不保证在一个生命周期内保持不变 过程。由于 ASID 寄存器仅提供 8 位 ASID 空间,我们可以拥有更多 Linux 有一个分配 ASID 的方案,而不是 256 个进程。对于一个新的过程,我们递增 最后使用的 ASID 值。当达到最后一个值时,我们必须采取一些行动。 TLB 被刷新(跨 SMP 系统中的所有处理器)。上下文中前 24 位的值 ID寄存器,可以被认为是一个“世代”号,递增。步入一个 新一代意味着上一代的所有 ASID 值现在都无效并且 ASID 编号重新开始。在上下文切换中,使用老一代的进程 上下文 ID 值的版本被分配一个新的 ASID

因此,当 ASID 用完时,cpu 会自动增加,当上下文切换时,内核会检查高位是否已设置(旧 ASID),如果是,则为任务创建新的 ASID。这样就可以避免我上面提到的问题。

谢谢。

关于linux - Linux内核中ASID用完了怎么处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17590146/

相关文章:

ruby-on-rails - 启动时在 Raspberry PI 上启动瘦服务器

linux - AMI 上的 AWS EC2 apache 日志文件位置

create_module - 为什么使用 copy_from_user?

c - 如何让编译器选择标志更新 ARM 指令?

c - 从tasklet运行用户空间进程

android - 如何仅使用一个应用程序制作嵌入式 Android 操作系统?

php - 通过 private.key 连接到 SFTP 服务器时出现问题

linux - 如何使用命令行在 Atom 中创建文件和文件夹?

linux - 为什么对 CONFIG_GCC_PLUGIN_RANDSTRUCT 的种子文件的读取权限不限于特权用户?

c - Linux内核中的udp_deliver api在哪里?