设为首页 加入收藏

TOP

Linux内核中platform框架中的一个小技巧
2014-11-24 08:39:31 来源: 作者: 【 】 浏览:0
Tags:Linux 内核 platform 框架 一个 技巧

先给出函数原型:


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,那在刚好撞上结构体后面跟的不是'\0',那岂不是内存越界?


查看结构体定义:


struct platform_object {
struct platform_device pdev;
char name[1];
};


心中的疑惑解了!


关键就在 char name[1];
这样结构体在分配内存的时候就会以结构体对齐的方式增加一块内存(不一定是一个字节),如果是常规32位的编译器,以四字节方式对齐的话那就是4个字节了。


就算撞到一些没有'\0'概念的同志,数据也不会越界。以后一定要将这个技巧应用在实战中,这一招确实可以极大的加大项目的健壮性。


另外在拷贝的时候是:


strcpy(pa->name, name);


把针指这四个字节都给省掉了,又省了四个字节的空间。


仔细体会,Linux真的有非常多精妙的地方。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux内核模块获取设备IP地址 下一篇QT/E 4.6.2和tslib 1.4在mini2440..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)
·使用华为开发者空间 (2025-12-27 04:19:24)
·Getting Started wit (2025-12-27 03:49:24)
·Ubuntu 上最好用的中 (2025-12-27 03:49:20)