专栏首页linux驱动个人学习Linux-3.14.12内存管理笔记【构建内存管理框架(4)】

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__属性定义,编译器通过arch/x86/kernel/vmlinux.lds链接脚本把__setup_cmdline_parse_movablecore放置在.init.setup段中。

注册的函数将会在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结构体,找到匹配的字符串及early成员为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在何处初始化的,而其值的由来呢?其值通过入参传递,在parse_early_param()函数中通过strlcpy()来自于boot_command_line全局变量。而boot_command_line早期则是在/arch/x86/kernel/head_32.s的初始化中来自于boot_params。具体 do_early_param()处理的数据来自于grub.cfg,也就是说required_movablecore和required_kernelcore也是来自于此。

好了,暂且分析至此,避免走偏了,该文也是一时好奇钻研了一下,记之以作备忘。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • linux内核调试技巧之一 dump_stack【转】

    遇到uvc_probe_video这么一个函数,不知道它最终是被谁调用到的,根据linux设备模型,初步推测,probe应该是设备适配驱动时总线轮训到的。

    233333
  • 高通msm8909耳机调试

    1、DTS相应修改: DTS相关代码:kernel/arch/arm/boot/dts/qcom/msm8909-qrd-skuc.dtsi: 1 s...

    233333
  • 宋宝华:Docker 最初的2小时(Docker从入门到入门)【转】

    最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料。本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,...

    233333
  • CVE-2018-4878 Flash 0day漏洞攻击样本解析

    背景 2018年1月31日,韩国CERT发布公告称发现Flash 0day漏洞的野外利用,攻击者执行针对性的攻击;2月1日Adobe发布安全公告,确认Adobe...

    FB客服
  • Allegro使用技巧(4)----Allegro17.2打开低版本文件

    最近尝鲜安装了Allegro17.2,但打开低版本PCB文件时出现问题,查阅资料后终于解决,在此记录一下。

    小火柴棒
  • Java生成词云!你喜欢得书都在图里!

    在github上找轮子得时候,发现了这么一个项目:Kumo(项目地址:https://github.com/kennycason/kumo),

    JAVA葵花宝典
  • 【号码归属地查询工具】

    工具目录下的“Database”目录中的“phone_are.dat”文件不要删除,信息查询是基于该数据库进行的:

    用户6184845
  • eclipse怎么调出server布局窗口

    打开Eclipse----Window菜单----Show View----Other

    祈澈菇凉
  • Python批量导出多个PPT/PPTX文件中每个幻灯片为独立JPG图片

    为啥会有这样一篇文章呢? 是因为我正在陆续把自己3年来整理的1900页Python教学PPT免费分享出来给大家学习参考。前面已经分享了几章,见“相关阅读”。 但...

    Python小屋屋主
  • golang-复习1

      type Person struct{  //l类型定义,地位等价与 int byte boo string ……通常放在全局位置

    landv

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动