2013-07-11 98 views
2

ARM架構中的ASID(地址空間標識符)在寄存器中佔用8位。這意味着可以分配256個ASID。但是在linux內核中,甚至有超過1024個任務可以同時運行。如何處理ASID的情況在Linux內核中已經用完了? 我已經檢查了內核源代碼,當ASID用完時,內核會從再次啓動時將ASID分配給新的任務。考慮到一種情況,最新的任務擁有第一個ASID(0b1000 0000 0000 0001),但是有一個任務必須已經擁有相同的ASID。如果這兩項任務需要cantext切換?我沒有找到相關的內核源代碼。 linux內核中的相關代碼位於〜/ kernel/core.c context_switch()中。任何回覆將非常感謝,提前致謝如何處理ASID的情況在Linux內核中用完了?

此致敬意。 蒼鷺

回答

1

我發現有關該一些指令,如下(皮質-A9程序員指南P8-20): ASID的是動態分配的,並且不保證是 過程的壽命期間保持恆定。由於ASID寄存器僅提供ASID空間的特定位,並且我們可以擁有比256個進程更多的操作系統,所以Linux有一個用於分配ASID的方案。對於新過程,我們將使用最後一個ASID值 。當達到最後一個值時,我們必須採取一些行動。 TLB 被刷新(跨SMP系統中的所有處理器)。 ID寄存器中的前24位中的值可以被視爲「通用」編號,該值被遞增。進入 新一代意味着上一代的所有ASID值現在無效,並且重新啓動ASID編號。在上下文切換,它使用老一代 版本上下文ID值的過程中被賦予了新的ASID

所以CPU會自動增加當ASID用完,當上下文切換內核將檢查是否高-bits被設置(舊的ASID),如果是的話爲該任務創建新的ASID。這樣可以避免我上面提到的問題。

謝謝。

相關問題