*参照元 [#r03944e9] #backlinks *説明 [#fbcea3b6] -パス: [[linux-2.6.33/arch/arm/mm/proc-v7.S]] -指定されたページテーブルに切り替える。 --MMU が無効ならば何もしない。 -processor 構造体の ARM 版ページにて、プロセッサごとの switch_mm の定義を補足しています。 -複数 CPU アーキテクチャに対応する場合、 この関数のポインタは processor 構造体の switch_mm メンバに入れられます。 --[[linux-2.6.33/processor]] **引数 [#xa0e13d0] -pgd_phys --おそらく unsigned long --スイッチ先のページテーブルの物理アドレス -struct mm_struct *tsk --スイッチ先のコンテキスト --[[linux-2.6.33/mm_struct]] **返り値 [#oe714b2d] -なし **参考 [#v601976d] *実装 [#s99e4faa] /* * cpu_v7_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_v7_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]] #ifdef CONFIG_ARM_ERRATA_430973 - --[[linux-2.6.33/CONFIG_ARM_ERRATA_430973]] mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB #endif -mcr: mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID isb -mcr: -isb: 命令同期バリア 1: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 isb -mcr: CP15 c2(VMSAv7、仮想メモリシステム制御)変換テーブルのベースレジスタに、 スイッチ先のコンテキストを転送する。 -やりたいことは <CRn, opc1, CRm, opc2> = <c0, 0, c0, 0> なので、 変換テーブルベース 0(TTBR0)の設定。 --ARM DDI 0406B ページ B3-113 にある、 B3.12.23「CP15 c2 および c3、メモリ保護および制御レジスタ」を参照。 -isb: 命令同期バリア mcr p15, 0, r1, c13, c0, 1 @ set context ID isb -mcr: -isb: 命令同期バリア #endif mov pc, lr ENDPROC(cpu_v7_switch_mm) - --[[linux-2.6.33/ENDPROC()]] *コメント [#r83f158c]