博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux中__weak关键字
阅读量:5241 次
发布时间:2019-06-14

本文共 3355 字,大约阅读时间需要 11 分钟。

在linux的驱动代码中经常可以看到__weak去修饰一个函数或者变量,大多是用来修饰函数。它的作用有两个:

1.weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。

2.__weak 在回调函数的时候经常用到。这样的好处是,系统默认定义了一个空的回调函数,保证编译器不会报错。同时,如果用户自己要定义用户回调函数,那么只需要重新定义即可,不需要考虑函数重复定义的问题,使用非常方便

在linux/init/main.c中有函数smp_setup_processor_id

void __init __weak smp_setup_processor_id(void){}

2.6.30内核中ARM结构没有额外定义smp_setup_processor_id(),所以ARM结构不执行任何操作。

n-ubuntu05@nubuntu05:linux-2.6.30.4$ grep -rn smp_setup_processor_id ./*./arch/sparc/kernel/smp_64.c:1182:void __init smp_setup_processor_id(void)./include/linux/smp.h:188:void smp_setup_processor_id(void);./init/main.c:528:void __init __weak smp_setup_processor_id(void)./init/main.c:541:  smp_setup_processor_id();

v4.9内核在./arch/arm/kernel/setup.c中定义了smp_setup_processor_id()

584 void __init smp_setup_processor_id(void)                                         585 {                                                                                586         int i;                                                                   587         u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0;      588         u32 cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);                                589                                                                                  590         cpu_logical_map(0) = cpu;                                                591         for (i = 1; i < nr_cpu_ids; ++i)                                         592                 cpu_logical_map(i) = i == cpu ? 0 : i;                           593                                                                                  594         /*                                                                       595          * clear __my_cpu_offset on boot CPU to avoid hang caused by             596          * using percpu variable early, for example, lockdep will                597          * access percpu variable inside lock_release                            598          */                                                                      599         set_my_cpu_offset(0);                                                    600                                                                                  601         pr_info("Booting Linux on physical CPU 0x%x\n", mpidr);                  602 }

由于linux/init/main.c中定义的函数有__weak属性,所以ARM使用的是./arch/arm/kernel/setup.c中定义的smp_setup_processor_id

v4.9其他结构中相关定义:

n-ubuntu05@nubuntu05:v4.9$ grep -rn smp_setup_processor_id ./*./arch/arm64/kernel/setup.c:95:void __init smp_setup_processor_id(void)./arch/s390/kernel/smp.c:930:void __init smp_setup_processor_id(void)./arch/sparc/kernel/smp_64.c:1238:void __init smp_setup_processor_id(void)./arch/arm/kernel/devtree.c:147:         * to override the map created in smp_setup_processor_id()../arch/arm/kernel/devtree.c:185:     * logical map created in smp_setup_processor_id() can be overridden./arch/arm/kernel/setup.c:584:void __init smp_setup_processor_id(void)./include/linux/smp.h:197:void smp_setup_processor_id(void);./init/main.c:452:void __init __weak smp_setup_processor_id(void)./init/main.c:487:  smp_setup_processor_id();

[参考] linux中__weak关键字的作用解析

https://www.2cto.com/kf/201810/784218.html

转载于:https://www.cnblogs.com/MR-White315/p/11175418.html

你可能感兴趣的文章
使用cwRsync实现windows下文件定时同步
查看>>
WOW.js和animate.css让页面滚动时显示动画
查看>>
linux 异常
查看>>
WPF 获取文件夹路径,目录路径,复制文件,选择下载文件夹/目录
查看>>
codeforces 659D D. Bicycle Race(水题)
查看>>
codeforces 696A A. Lorenzo Von Matterhorn(水题)
查看>>
获取全部校园网
查看>>
扯扯MySQL 5.6.19 Administrative Roles and Global Privileges
查看>>
2017-2018-1 20155220 《信息安全系统设计基础》课下实践——实现mypwd
查看>>
jquery/js不支持ie9以下版本的方法或属性
查看>>
Swift基础
查看>>
统计一个字符串中各个英文单词的出现的频数
查看>>
最新Ubuntu10.10 更新源
查看>>
五大原则 (单一职责、开放封闭、里氏代换、接口隔离、依赖倒置)
查看>>
js学习-day04
查看>>
前端开发 - CSS - 上
查看>>
集成备注
查看>>
CSRF原理
查看>>
HDU 1518 Square(Dfs)
查看>>
Mysql基础3
查看>>