Arm-Linux 2次ページテーブルの問題
以前、arm-linuxという2次ページ表がlinuxバージョンとハードウェアバージョンに分かれているのをドキュメントとコードで見たことがあります.ずっと概念が混乱していて、よく研究していないと思っていましたが、今日やっとこの問題に遭遇して、勉強しなければなりません.
do_page_fault()プロセスでは、次の関数が呼び出されます.
その機能は、この新しい申請の2級ページ表をPMDに関連付けることです.その前にpmdpが指すPMD項は空であり,現在のプロセスはマッピングを確立している.この関数を呼び出す前に、4 Kサイズの2次ページテーブルを申請しました.
pmdp[0] = __pmd(pmdval); この行はpteに基づいて生成されたPMDテーブルエントリの値をPMDエントリに割り当てることを容易に理解できる.しかし、次の言葉はなぜですか.
まず、二次ページ表の大きさを見てみましょう.arm-linuxは粗粒度二次ページ表マッピングを採用しています.このマッピング関係を使用すると、PMD表項目の下に1 Mメモリをマッピング/上書きし、PTE項目の下に4 Kメモリをマッピング/上書きするので、一次二次表には1 M/4 K=256表項目があるはずです.一方、1つの2次テーブル項目は4バイトであるため、1枚の2次テーブルには256*4=1 Kバイトのスペースが必要である.4 Kのメモリ・ページには、2次テーブルが4枚格納されます.
次に、二次ページテーブルについて、カーネルはなぜか二次ページテーブルに2つのバージョン(Linuxバージョン、ハードウェアバージョン)を提供します.また、2つのバージョンのテーブルの位置関係は曖昧に定義されています.pgalloc.を見てhの1つの注釈図:
上(低)から下(高)までは、1枚目のテーブルのハードウェアバージョン、2枚目のテーブルのハードウェアバージョン、1枚目のテーブルのLinuxバージョン、2枚目のテーブルのLinuxバージョンです.同じテーブルのlinuxバージョンとハードウェアバージョンは不連続ですが、2つの異なるテーブルの同じバージョンは連続しています.このような4枚の表を一緒に置くのは、4 Kのページサイズに揃えてスペースを無駄にしないためだと思います.
これで、すべてがよく理解できます.上記の関数の次の行:
pmdp[1] = __pmd(pmdval 256 * sizeof(pte_t));
2枚目のハードウェアテーブルの対応するPMD値を次のPMDテーブル項目に書きます.
この関数は実際に2つの2次テーブルのマッピングを完了した.
do_page_fault()プロセスでは、次の関数が呼び出されます.
[c]
static inline void __pmd_populate(pmd_t *pmdp, unsigned long pmdval)
{
pmdp[0] = __pmd(pmdval);
pmdp[1] = __pmd(pmdval 256 * sizeof(pte_t));
flush_pmd_entry(pmdp);
}
[/c]
その機能は、この新しい申請の2級ページ表をPMDに関連付けることです.その前にpmdpが指すPMD項は空であり,現在のプロセスはマッピングを確立している.この関数を呼び出す前に、4 Kサイズの2次ページテーブルを申請しました.
pmdp[0] = __pmd(pmdval); この行はpteに基づいて生成されたPMDテーブルエントリの値をPMDエントリに割り当てることを容易に理解できる.しかし、次の言葉はなぜですか.
まず、二次ページ表の大きさを見てみましょう.arm-linuxは粗粒度二次ページ表マッピングを採用しています.このマッピング関係を使用すると、PMD表項目の下に1 Mメモリをマッピング/上書きし、PTE項目の下に4 Kメモリをマッピング/上書きするので、一次二次表には1 M/4 K=256表項目があるはずです.一方、1つの2次テーブル項目は4バイトであるため、1枚の2次テーブルには256*4=1 Kバイトのスペースが必要である.4 Kのメモリ・ページには、2次テーブルが4枚格納されます.
次に、二次ページテーブルについて、カーネルはなぜか二次ページテーブルに2つのバージョン(Linuxバージョン、ハードウェアバージョン)を提供します.また、2つのバージョンのテーブルの位置関係は曖昧に定義されています.pgalloc.を見てhの1つの注釈図:
上(低)から下(高)までは、1枚目のテーブルのハードウェアバージョン、2枚目のテーブルのハードウェアバージョン、1枚目のテーブルのLinuxバージョン、2枚目のテーブルのLinuxバージョンです.同じテーブルのlinuxバージョンとハードウェアバージョンは不連続ですが、2つの異なるテーブルの同じバージョンは連続しています.このような4枚の表を一緒に置くのは、4 Kのページサイズに揃えてスペースを無駄にしないためだと思います.
これで、すべてがよく理解できます.上記の関数の次の行:
pmdp[1] = __pmd(pmdval 256 * sizeof(pte_t));
2枚目のハードウェアテーブルの対応するPMD値を次のPMDテーブル項目に書きます.
この関数は実際に2つの2次テーブルのマッピングを完了した.