GNU C语法扩展(9)

要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特性对于我们分析内核有着很重要的作用,下面做些总结性的工作。

9、特殊属性声明

GNU C允许声明函数、变量和类型的特殊属性,以便进行手工的代码优化和定制代码检查的方法。

  • no return属性用于函数,表示该函数从不返回。这可以让编译器生成稍微优化的代码,最重要的是可以消除不必要的警告信息比如未初使化的变量。例如:
//include/linux/kernel.h
#define ATTRIB_NORET __attribute__((noreturn))...
asmlinkage NORET_TYPE void do_exit(long error_code) ATTRIB_NORET;
  • format(ARCHETYPE,STRING-INDEX,FIRST-TO-CHECK)属性用于函数,表示该函数使用
    printf,scanf或strftime风格的参数,使用这类函数最容易犯的错误是格式串与参数不匹配,指定format属性可以让编译器根据格式串检查参数类型。例如:
//include/linux/kernel.h
asm linkage int printk(const char* fmt, ...)__attribute__((format(printf,1,2)));

表示第一个参数是格式串,从第二个参数起根据格式串检查参数。

  • unused属性用于函数和变量,表示该函数或变量可能不使用,这个属性可以避免编译器产生警告信息。

  • section("section-name")属性用于函数和变量,通常编译器将函数放在.text区,变量放在.data区或.bss区,使用section属性,可以让编译器将函数或变量放在指定的节中。例如:

//include/linux/init.h
#define __init __attribute__((__section__(".text.init")))
#define __exit __attribute__((unused,__section__(".text.exit")))
#define __init data__attribute__((__section__(".data.init")))
#define __exit data__attribute__((unused,__section__(".data.exit")))

#define __initsetup __attribute__((unused,__section__(".setup.init")))
#define __init_call __attribute__((unused,__section__(".initcall.init")))
#define __exit_call __attribute__((unused,__section__(".exitcall.exit")))

连接器可以把相同节的代码或数据安排在一起,Linux内核很喜欢使用这种技术,例如系统的初始
化代码被安排在单独的一个节,在初始化结束后就可以释放这部分内存。

  • aligned(ALIGNMENT)属性用于变量、结构或联合类型,指定变量、结构域、结构或联合的对齐量,以字节为单位,例如:
//include/asm-i386/processor.h
struct i387_fxsave_struct{
    unsigned short cwd;
    ...
}__attribute__((aligned(16)));

表示该结构类型的变量以16字节对齐。通常编译器会选择合适的对齐量,显示指定对齐通常是由于体系限制、优化等原因。

  • packed属性用于变量和类型,用于变量或结构域时表示使用最小可能的对齐,用于枚举、结构或联合类型时表示该类型使用最小的内存。例如:
//include/asm-i386/desc.h
struct Xgt_desc_struct{
    unsigned short size;
    unsigned long address__attribute__((packed));
};

域address将紧接着size分配。属性packed的用途大多是定义硬件相关的结构,使元素之间没有因
对齐而造成的空洞。


===========我是华丽的分割线===========


更多知识:
点击关注专题:嵌入式Linux & ARM

或浏览器打开:https://www.jianshu.com/c/42d33cadb1c1

或扫描二维码:

全部评论

相关推荐

2025-12-31 19:23
已编辑
门头沟学院 Java
ssob是已读不回的,字节是压根不敢投的,简历是反反复复改了N遍的,八股是永远背不完的😅😅😅扯远了,道心破碎了,把简历发出来让大伙先看看笑话。再说正事。寒假日常实习还是很难找,连个面试都难约,我不是个例,这是网上普遍反映。不报希望了,趁着2、3月前赶紧做些什么才是。扔几个碎碎念:1.这破简历还能怎么改?写到什么程度才能过实习岗筛选?广大牛友来锐评一下2.火速辅修go,是否可行目前看来是学习成本最小的。首先,很多go实习岗位已经明确要求掌握gin等技术栈,拿java简历投go的时代已经过去了。其次,很多后端的东西,MySQL、Redis这些都是通用的,不用重新学。所以这个问题就具体为:2.1 java&go混血简历怎么写第一个项目,仿大麦的微服务,不太好改。因为有用到Redisson、AOP、SpringAI这些java强相关的东西,包装成go需要替换这些方案。第二个,点评魔改。应该可以包装成go,github上也有人用go重写过。2.2 java&go通用的轮子RPC直接pass了,太烂大街了。不知道动态线程池能不能做。反正项目上新有风险,不一定来得及,非必要就不开新的项目。补充:别跟我扯RAG了,这玩意已经成新的烂大街了,详见我上一篇的吐槽。3.认真学微调prompt什么的这个半步踩进算法了已经。八股和场景题完全就是另一套,没两三个月搞不定的。约等于换方向
简历中的项目经历要怎么写
点赞 评论 收藏
分享
七牛云头号黑子:人家是过度包装被看出来没过简历,你是包都不包啊兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务