加入收藏 | 设为首页 | 会员中心 | 我要投稿 泉州站长网 (https://www.0595zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Linux内核中platform框架中的一个小方法

发布时间:2021-11-30 12:42:57 所属栏目:教程 来源:互联网
导读:先给出函数原型: struct platform_device *platform_device_alloc(const char *name, int id) { struct platform_object *pa; pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL); if (pa) { strcpy(pa-name, name); pa-pdev.name =

先给出函数原型:
 
struct platform_device *platform_device_alloc(const char *name, int id)
{
 struct platform_object *pa;
 
 pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
 if (pa) {
  strcpy(pa->name, name);
  pa->pdev.name = pa->name;
  pa->pdev.id = id;
  device_initialize(&pa->pdev.dev);
  pa->pdev.dev.release = platform_device_release;
 }
 
 return pa ? &pa->pdev : NULL;
}
 
关键就在:
 
 pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
 
我初一看,用strlen没有加1,那在刚好撞上结构体后面跟的不是'',那岂不是内存越界?
 
查看结构体定义:
 
struct platform_object {
 struct platform_device pdev;
 char name[1];
};
 
心中的疑惑解了!
 
关键就在 char name[1];
这样结构体在分配内存的时候就会以结构体对齐的方式增加一块内存(不一定是一个字节),如果是常规32位的编译器,以四字节方式对齐的话那就是4个字节了。
 
就算撞到一些没有''概念的同志,数据也不会越界。以后一定要将这个技巧应用在实战中,这一招确实可以极大的加大项目的健壮性。
 
另外在拷贝的时候是:
 
 strcpy(pa->name, name);
 
把针指这四个字节都给省掉了,又省了四个字节的空间。
 
仔细体会,Linux真的有非常多精妙的地方。

(编辑:泉州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读