4

ARM アーキテクチャの ASID (アドレス空間識別子) は、レジスタ内の 8 ビットを占有します。つまり、256 個の ASID を割り当てることができます。しかし、Linux カーネルでは、同時に実行できるタスクの数は 1024 を超えます。Linux カーネルで ASID が使い果たされた場合の対処方法は? カーネルのソース コードを確認したところ、ASID が使い果たされると、カーネルは最初から ASID を新しいタスクに割り当てます。1 つの状況を考慮すると、最新のタスクが最初の ASID (0b1000 0000 0000 0001) を所有していますが、1 つのタスクが既に同じ ASID を所有している必要があります。その 2 つのタスクでテキストを切り替える必要がある場合はどうすればよいでしょうか? 関連するカーネル ソース コードが見つかりませんでした。Linux カーネルの関連コードは ~/kernel/core.c context_switch() にあります。

よろしくお願いします。ヘロン

4

2 に答える 2

3

次のように、それに関するいくつかの指示を見つけました(Cortex -A9プログラマーガイドP8-20): ASID は動的に割り当てられ、プロセスの存続期間中一定であるとは限りません。ASID レジスタは 8 ビットの ASID スペースしか提供せず、256 を超えるプロセスを使用できるため、Linux には ASID を割り当てるためのスキームがあります。新しいプロセスでは、最後に使用された ASID 値を増やします。最後の値に達したら、何らかのアクションを実行する必要があります。TLB がフラッシュされます (SMP システム内のすべてのプロセッサーにわたって)。「世代」番号と見なすことができるコンテキスト ID レジスタの上位 24 ビットの値がインクリメントされます。新しい世代へのステップは、前の世代からのすべての ASID 値が無効になり、ASID の番号付けが再開されることを意味します。コンテキスト スイッチでは、コンテキスト ID 値の古い世代のバージョンを使用するプロセスに新しい ASID が割り当てられます。

したがって、CPU は ASID が使い果たされると自動的にインクリメントされ、コンテキスト スイッチ カーネルは上位ビットが設定されているかどうか (古い ASID) をチェックし、設定されている場合はタスク用に新しい ASID を作成します。これにより、上記の問題を回避できます。

ありがとう。

于 2013-07-12T01:32:28.147 に答える
0

ここに素晴らしい説明があります:

https://community.arm.com/thread/8219

255までインクリメントするのではなく、ASIDのビットマップを参照することを除いて、Heronの回答とほぼ一致します。

于 2016-06-07T15:44:57.480 に答える