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 を見つけたので別途確認入れます。