Look at real operating systems to see how they size memory. (9)
色々なドキュメントを流し読みして r2 レジスタに_Flattened Device Tree (FDT)_なポインタが格納されているのは理解した。で、setup.c の setup_arch 手続きの以下の部分で云々な模様。
void __init setup_arch(char **cmdline_p) { struct machine_desc *mdesc; unwind_init(); setup_processor(); mdesc = setup_machine_fdt(__atags_pointer); if (!mdesc) mdesc = setup_machine_tags(machine_arch_type);
ええと、__atags_pointer って調べたような気もするが。
あったぞ。
./kernel/head-common.S:115: .long __atags_pointer @ r6
ちなみに r6 レジスタですが、start_kernel を呼び出す __mmap_switched 手続きの最後らへんで r2 から r6 に退避されております。
str r2, [r6] @ Save atags pointer bic r4, r0, #CR_A @ Clear 'A' bit stmia r7, {r0, r4} @ Save control register values b start_kernel ENDPROC(__mmap_switched)
で、setup_machine_fdt 手続きの中で of_scan_flat_dt 手続きを使ってメモリ容量の検出を行なっているはず。以下なブロックなソレは確認必要か。
/* Retrieve various information from the /chosen node */ of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line); /* Initialize {size,address}-cells info */ of_scan_flat_dt(early_init_dt_scan_root, NULL); /* Setup memory, calling early_init_dt_add_memory_arch */ of_scan_flat_dt(early_init_dt_scan_memory, NULL);
ここ、色んな意味でポイント高いんですがハードルも高いな。