kernel内存分配函数--Apple的学习笔记

前言:

uboot定制双系统完成后,我今天正式进入了Kernel及驱动开发了。没想到只是在driver_init函数中看到一个kobject_set_name函数就让我多了些思考,多了些收获,所以记录下来。

1. kernel内存分配函数kmalloc、kzalloc、vmalloc的区别

image.png

2. Linux中为什么常用堆,而单片机中常用全局变量

答:按照应用场景,Linux遇到长度不同的应用场景比较多。一方面是基于传统单片机的资源有限、使用全局变量的开销更低,另一方面传统单片机的程序模块较少、耦合度易于人工控制。

如下函数的理解中,一开始没看懂这2句

    kfree_const(kobj->name);
    kobj->name = s;

所以对于linux指针类的赋值,先申请空间,然后赋值。这里释放后,直接赋值,是不是会跑飞?后来再想想s在上面kvasprintf_const函数中的kstrdup已经申请了内存空间,所以kobj->name = s;可以理解为一个申请过空间及赋过值的指针s挂到了Kobj->name指针上。哈哈原来不能断章取义~

int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
                  va_list vargs)
{
    const char *s;

    if (kobj->name && !fmt)
        return 0;

    s = kvasprintf_const(GFP_KERNEL, fmt, vargs);
    if (!s)
        return -ENOMEM;

    /*
     * ewww... some of these buggers have '/' in the name ... If
     * that's the case, we need to make sure we have an actual
     * allocated copy to modify, since kvasprintf_const may have
     * returned something from .rodata.
     */
    if (strchr(s, '/')) {
        char *t;

        t = kstrdup(s, GFP_KERNEL);
        kfree_const(s);
        if (!t)
            return -ENOMEM;
        strreplace(t, '/', '!');
        s = t;
    }
    kfree_const(kobj->name);
    kobj->name = s;

    return 0;
}

你可能感兴趣的:(kernel内存分配函数--Apple的学习笔记)