*参照元 [#ya0ae156] #backlinks *説明 [#a46985d8] -パス: [[linux-2.6.33/arch/arm/mm/proc-v6.S]] -指定されたページテーブルに切り替える。 --MMU が無効ならば何もしない。 -processor 構造体の ARM 版ページにて、 プロセッサごとの switch_mm の定義を補足しています。 -複数 CPU アーキテクチャに対応する場合、 この関数のポインタは processor 構造体の switch_mm メンバに入れられます。 --[[linux-2.6.33/processor]] **引数 [#ud957ad4] -pgd_phys --おそらく unsigned long --スイッチ先のページテーブルの物理アドレス -struct mm_struct *tsk --スイッチ先のコンテキスト --[[linux-2.6.33/mm_struct]] **返り値 [#r551b7ca] -なし **参考 [#jb48ff6e] *実装 [#c4e174a6] /* * cpu_arm926_switch_mm(pgd_phys, tsk) * * Set the translation table base pointer to be pgd_phys * * - pgd_phys - physical address of new TTB * * It is assumed that: * - we are not using split page tables */ ENTRY(cpu_v6_switch_mm) - --[[linux-2.6.33/ENTRY()]] #ifdef CONFIG_MMU -MMU が有効の場合 --[[linux-2.6.33/CONFIG_MMU]] mov r2, #0 ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id orr r0, r0, #TTB_FLAGS -mov: r2 を 0 クリア -ldr: r1(第二引数)は struct mm_struct へのポインタ、 (r1)->context.id の取得を行う。 --アドレス r1 + (MM_CONTEXT_ID = context.id へのオフセット値) から、 ロードしているだけ。 --[[linux-2.6.33/MM_CONTEXT_ID]] -orr: ページテーブルのメモリ属性(キャッシュ可/不可、 ライトスルー/ライトバック)を指定する。 --[[linux-2.6.33/TTB_FLAGS]] mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB -mcr: CP15 c7(キャッシュ制御)に 0 を転送する。 -やりたいことは <crm, opcode_2> = <c5, 6> なので、 分岐先キャッシュ全体をフラッシュする。 --ARM DDI 0100HJ-00 ページ B6-21 にある、 表 B6-6「レジスタ7: キャッシュ制御と類似機能」を参照。 mcr p15, 0, r2, c7, c10, 4 @ drain write buffer -mcr: CP15 c7(キャッシュ制御)に 0 を転送する。 -やりたいことは <crm, opcode_2> = <c10, 4> なので、 データ同期バリア。 以前はライトバッファドレインだった(コメントも古いままですね…)。 --ARM DDI 0100HJ-00 ページ B6-22 にある、 表 B6-6「レジスタ7: キャッシュ制御と類似機能(続き)」を参照。 mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 -mcr: CP15 c2(VMSAv6、仮想メモリシステム制御)変換テーブルのベースレジスタに、 スイッチ先のコンテキストを転送する。 -やりたいことは <crm(無視される), opcode_2> = <c0, 0> なので、 変換テーブルベース 0(TTBR0)の設定。 --ARM DDI 0100HJ-00 ページ B4-41 にある、 B4.9.2「レジスタ2: 変換テーブルのベース」を参照。 mcr p15, 0, r1, c13, c0, 1 @ set context ID -mcr: CP15 c13(VMSAv6、仮想メモリシステム制御)プロセス ID レジスタに、 スイッチ先のコンテキストを転送する。 --コンテキスト ID には mm_struct の context.id の値が指定される。 --[[linux-2.6.33/mm_struct]] -やりたいことは <crm(無視される), opcode_2> = <c0, 1> なので、 コンテキスト ID の設定。 --ARM DDI 0100HJ-00 ページ B4-52 にある、 B4.9.10「レジスタ13: プロセス ID」を参照。 #endif mov pc, lr -呼び出し元に戻る。 *コメント [#pf2cb6aa]