ページフォルトについて

uClinux 調査環境について - まだ見えない先の
詳解LINUXカーネル p.401
uClinux では,arch/arm/head.S にて MMU を有効にしていないためページ変換フォルトによるアボートは発生しない.
ページ変換フォルトによりアボートされたアクセスがデータアクセスかキャッシュ保守操作の場合、データアボート例外が発生する*1
Linux では,データアボート例外ハンドラを arch/arm/kernel/entry-armv.S にてセットしている*2.データアボート例外時は arch/arm/mm/fault.c do_DataAbort() が呼ばれる.

asmlinkage void __exception do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)

例外原因をフォルトステータスレジスタ fsr から割り出す.ページ変換フォルトによるデータアボート例外時,fsr は 0x0b00111 となる*3

const struct fsr_info *inf = fsr_info + (fsr & 15) + ((fsr & (1 << 10)) >> 6);
=> inf = fsr_info[7]
=> { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" },

となり,fault.c do_page_fault() が呼ばれる.

static int do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)

do_page_fault()から呼ばれる include/linux/mm.h handle_mm_fault() にて,noMMU時は

/* should never happen if there's no MMU */
BUG();
return VM_FAULT_SIGBUS;

となっている.
よって,uClinuxではページフォルトは起こらないと仮定していると考えられる.

*1:DDI0100 B4.5.1 MMU フォルト

*2:正確には,entry-armv.S にてハンドラは __vectors_start,__vectors_end の間にセットされ,arch/arm/kernel/traps.c trap_init() にてそれをメモリ中のベクタテーブルにコピーしている.

*3:DDI0100 表B4-6 フォルトステータスレジスタエンコード