linux 内核 全局变量,kernel内存分配函数--Apple的学习笔记

前言:

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

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

44ebaacb7090

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值