Look at real operating systems to see how they size memory. (7)
今日も何故かまっぴるまから県立図書館に居たりします。とりあえず memblock.c をなんとなく確認してみるなど。
先頭から
グローバルな領域ということで以下な定義があります。
struct memblock memblock __initdata_memblock; int memblock_debug __initdata_memblock; int memblock_can_resize __initdata_memblock; static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS + 1] __initdata_memblock; static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_REGIONS + 1] __initdata_memblock;
memblock な領域とその中の memory.regions および reserved.regions 向けと思われる領域を確保していると思われます。ちなみに INIT_MEMBLOCK_REGIONS の定義が include/linux/memblock.h で以下。
#define INIT_MEMBLOCK_REGIONS 128
あと、memblock_can_resize などという面白いスイッチがありますね。あと上記の類推を確認するために検索してみたら memblock_init で以下な記述がありますね。
/* Hookup the initial arrays */ memblock.memory.regions = memblock_memory_init_regions; memblock.memory.max = INIT_MEMBLOCK_REGIONS; memblock.reserved.regions = memblock_reserved_init_regions; memblock.reserved.max = INIT_MEMBLOCK_REGIONS;
あら?
よくよく見てみるに、mm/memblock.c の中に記述されてる手続きは殆どが __init とか __init_memblock という修飾子が付けられてますね。
基本的に early_alloc などという手続きを使わざるを得ない状況で有効、ということなのか。やっぱそもそもの情報 (meminfo 云々) をどうやって取得してるのか、はポイント高そうですね。
ので、ちょっと確認してみました
件の手続き呼び出しが以下。
mdesc = setup_machine_fdt(__atags_pointer);
arch/arm/kernel/setup.c で定義されている setup_arch 手続き先頭ちょい下あたり。引数で渡している __atags_pointer ですが、何モノかが格納されている節が皆無。
M-x find-grep してみたら
./kernel/head-common.S:115: .long __atags_pointer @ r6
な出力を確認。arch/arm/kernel/head-common.S の中身を確認してみたのですが、関係していると思われる __mmap_switched という手続きは start_kernel に jmp しているような記述がありますね。
b start_kernel ENDPROC(__mmap_switched)
ええと、arch/arm/kernel 配下に vmlinux.lds.S を見つけたので別途確認入れます。