1

L2 ページ テーブルのベース アドレスはどのように決定できますか? (ARM Cortex-A9 を使用)

たとえば、7KB のデータ空間を必要とし、アドレス 0x0 から始まるプログラムがある場合、4KB のページが 2 つ必要です。そのために、L2 ページ テーブルのベース アドレスを指すエントリを L1 ページ テーブルに追加します。次に、そのように L2 ページ テーブルに 2 つのエントリを追加します (最初のページは addr = 0x0、2 番目のページは 0x1000)。

u32 *ptr;
u32 small_page;

small_page = addr / 0x1000;
ptr        = small_page + L2_table_base_addr;
*ptr       = (addr & 0xFFFFF) | attributes;

今、私がまだ理解していないことが1つあります。L2 ページ テーブルのベース アドレスを特定するにはどうすればよいですか? L1 ページ テーブルの直後にテーブルを配置する必要がありますか?

アドレスはどこに保存できますか? L1 ページ テーブルのベース アドレスがコプロセッサ レジスタに格納されていることはわかっていますが、L2 ベース アドレスを格納するレジスタが見つかりませんでした。

確認すべきもう 1 つの質問は、コプロセッサ レジスタ TTBR0 と TTBR1 の両方が L1 ページのベース アドレスを保持していることです。それぞれ独自に。L1はTTBR0、L2はTTBR1じゃないですよね?

4

1 に答える 1

0

Cortex-A Series Programmers Guide の Chapter 9 Memory Management Unit を読むことをお勧めします。そこには、ベースアドレスストレージに関する明確な説明があります。レベル 1 TTB のベース アドレスは、2 つのベース レジスタの 1 つに格納されます (テーブルが OS コードまたはユーザー プロセス コードのどちらを配置するかに応じて、TTRB 0/1)。これら 2 つのベース レジスタは、コンテキストの切り替え時に役立ちます。

必要な L2 変換テーブル エントリのアドレスは、レベル 2 変換テーブルの (1KB にアラインされた) ベース アドレス (レベル 1 変換テーブル エントリによって与えられる) を取得し、仮想アドレスの 8 ビット (ビット [19: 12]) を L2 変換テーブルの 256 エントリ内でインデックス化します (256 はインデックスあたり 4 バイトであるため、合計バイト数は 256*4 バイト = 1KB です)。

于 2015-04-16T01:02:37.990 に答える