前の解析のメモリ管理フレームワークを実現するために構築されたが、我々は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それよりも言うことです。
まあ、時間のために簡単な道を避けるために、これまでに分析されている、記事では、メモのノートを作るために、好奇心の少し掘り下げます。