ノートを構築するためのLinux 3.14.12メモリ管理、メモリ管理フレームワーク[(4)]

前の解析のメモリ管理フレームワークを実現するために構築されたが、我々はfind_zone_movable_pfns_for_nodesを()と呼ばが、ここでは単にrequired_movablecoreとrequired_kernelcoreのためのサプリメントを行い、何かを繰り返すように準備ができていません。

例をrequired_movablecoreするには、コードは明らかに価値が疑わ割り当てを達成するために)一つだけcmdline_parse_movablecore(から来る示すものではありません。

【file:/mm/page_alloc.c】
/*
 * movablecore=size sets the amount of memory for use for allocations that
 * can be reclaimed or migrated.
 */
static int __init cmdline_parse_movablecore(char *p)
{
    return cmdline_parse_core(p, &required_movablecore);
}

どのcmdline_parse_core()の実装:

【file:/mm/page_alloc.c】
static int __init cmdline_parse_core(char *p, unsigned long *core)
{
    unsigned long long coremem;
    if (!p)
        return -EINVAL;
 
    coremem = memparse(p, &p);
    *core = coremem >> PAGE_SHIFT;
 
    /* Paranoid check that UL is enough for the coremem value */
    WARN_ON((coremem >> PAGE_SHIFT) > ULONG_MAX);
 
    return 0;
}

値は、おそらく結果は、順番に、で見つけることができますされています。

【file:/mm/page_alloc.c】
early_param("movablecore", cmdline_parse_movablecore);

これは、マクロを登録する機能である、マクロは次のように拡張されます

static const char __setup_str_cmdline_parse_movablecore[] __attribute__ ((__section__(".init.rodata"))) __attribute__((aligned(1))) = "movablecore"; static struct obs_kernel_param __setup_cmdline_parse_movablecore __attribute__((__used__)) __attribute__ ((__section__(".init.setup"))) __attribute__((aligned((sizeof(long))))) = { __setup_str_cmdline_parse_movablecore, cmdline_parse_movablecore, 1 }

__section__属性の定義を借りてこれにより、アーチ/ x86の/カーネルによってコンパイラは、セクションに__setup_cmdline_parse_movablecore / .init.setup置かれたスクリプトへのリンクをvmlinux.lds。

登録された関数は、do_early_param()、関連するコードに呼び出されます。

【file:/init/main.c】
/* Check for early params. */
static int __init do_early_param(char *param, char *val, const char *unused)
{
    const struct obs_kernel_param *p;
 
    for (p = __setup_start; p < __setup_end; p++) {
        if ((p->early && parameq(param, p->str)) ||
            (strcmp(param, "console") == 0 &&
             strcmp(p->str, "earlycon") == 0)
        ) {
            if (p->setup_func(val) != 0)
                pr_warn("Malformed early option '%s'\n", param);
        }
    }
    /* We accept everything at this stage. */
    return 0;
}

手段__setup_start __setup_end範囲マーカーによって見ることができる、.init.setup obs_kernel_param横断する構造体部は、一致する文字列のメンバーを検索するように構成された、初期およびtrueの場合であるsetup_func呼ばされますデータは初期化に対応することにより、フック関数、。

do_early_param()関数は、関係の初期化中に呼び出されます。

do_early_param()関数は、関係の初期化中に呼び出されます。

start_kernel()

->setup_arch()

->parse_early_param()

->parse_early_options()

->parse_args()

->parse_one()

->do_early_param()

ここだけrequired_movablecoreとrequired_kernelcore初期化を示し、その値は、それの起源のですか?boot_command_lineグローバル変数からstrlcpyに()によりparse_early_param()関数では、基準値を渡すことによって。そして、それはboot_paramsから/arch/x86/kernel/head_32.sを初期化する初期のboot_command_lineです。grub.cfgから詳細do_early_paramデータ()プロセス、すなわちrequired_movablecoreとrequired_kernelcoreそれよりも言うことです。

まあ、時間のために簡単な道を避けるために、これまでに分析されている、記事では、メモのノートを作るために、好奇心の少し掘り下げます。

おすすめ

転載: www.cnblogs.com/linhaostudy/p/11628810.html