2

変換テーブルのエントリを更新する手順は?

ARM920T の MMU を使用して、メモリを保護しています。プロセスを切り替えるとき、他のプロセスのメモリを保護するためにいくつかのエントリを変更する必要があります。テーブルを (メモリ内で) 更新した後、完全な TLB 無効化を発行します (念のため、ロックされたエントリもありません) が、新しいプロセスは前のプロセスのデータに引き続きアクセスできます。

テーブルをトラバースすると、すべてが正常に表示されます (つまり、他のプロセス領域は「USR モードではアクセス不可」に設定されています)。

編集 TLBの無効化の前に、(両方のキャッシュで)完全なキャッシュのクリーンと無効化も行いますが、これは何も変更しません。

4

2 に答える 2

1

いくつかの正当な理由により、ページテーブルが強く順序付けられている領域をマップする必要があります。パフォーマンスが少し低下しますが、テーブルへの書き込みやメモリバリアの発行後に完全なキャッシュをフラッシュするよりはましです。

あなたが何を尋ねようとしているのか、どこに問題があるのか​​ 正確にはわかりませんが、これは私のソフトウェアの1つで使用しているものです。

.align
arch_mmu_map_section:
#if ARM_WITH_MMU
    ldr     r3, =MMU_TLB          @ r3 = &table
    add     r1, r3, r1, lsr #18   @ r1 = &table + offset(entry)
    ldr     r3, =0xFFFFF          @ r3 = (1<<20) - 1
    bic     r0, r0, r3            @ Align r0 to 1 MB
    orr     r0, r0, r2            @ ORR the flags
    str     r0, [r1]              @ Write entry to r1, pointer to entry
    @ Invalidate UTLB
    mov     r3, #0
    mcr     p15, 0, r3, c8, c7, 0
#endif
    bx      lr

MMU_TLB はテーブルへのポインターであり、mmu_init 中に厳密に順序付けされたものとしてマップされます。この関数のプロトタイプは次のようになります。

void arch_mmu_map_section(addr_t paddr, addr_t vaddr, uint flags);
于 2012-07-05T23:05:00.950 に答える
1

ページの変更後に維持する必要があるのは、TLB だけではありません。特に、実行可能コードを含むものはそうです。最初に、変更が物理メモリに反映されていることを確認する必要があります (つまり、変更したページ テーブルを指すキャッシュ領域を消去します)。古いコード領域の行が含まれている可能性があるため、命令キャッシュを無効にする必要があります。キャッシュの種類によっては、ページ テーブルを更新する前にデータ キャッシュを消去し、変更後にデータ キャッシュを無効にする必要がある場合があります。最後に、指定した順序で操作が完了するように、十分なバリアを用意する必要があります。

于 2012-07-05T18:27:19.067 に答える