gcc编译相关,特殊宏,__bitwise __force __init __initdata 等

6轴机械臂(拟人臂+球形腕(三轴相交于一点))正逆运动学求解 1、DH坐标下机械臂参数 theta=[pi/10,pi/2,pi/4,-pi/4,pi/4,-pi/8];%关节角度 a=[0, 0.260, 0.025, 0, 0, 0];%连杆长度 d=[0, 0, 0, 0.280, 0, 0.072];%偏移距离 alpha=[pi/2, 0, pi/2, -pi/2 , pi/2, 0];%RBR型6轴机械臂 使用... 阅读详情
  •  __bitwise 
 用于编译时sparse的强制类型检查,我们知道数值类型有Little-Endian,Big-Endian 以及 CPU-Endian等,

 参考 http://www.woxihuan.com/74285086/1351231634127226.shtml

  • __init、__initdata和__exit、__exitdata

定义位于<linux/init.h>,

这些宏定义的作用是告诉编译器将这些函数或者数据放入相应的section中,而在模块加载的阶段,.ko文件中的代码和数据的加载区域是根据section来加载的。

 

函数的定义中带有__init: 这个函数的所有代码会被放入.init.text的section中。

函数的定义中带有__initdata:这个函数的所有代码会被放入.init.data的section中。 

之所以要使用这个宏定义,是标记为初始化的函数和数据,表明该函数和数据仅在初始化期间使用。

在模块装载之后,模块装载就会将初始化函数扔掉。这样可以将该函数占用的内存释放出来。 

这种释放根据是否编译进内核是有区别的:

(1)模块编译进内核:所有的初始化数据和函数都是在系统启动的最后阶段,在所有模块都初始化完成以后被内核统一释放的。所有你一般可以在内核启动信息的后面看到:

1.                        Freeing init memory: 196K

(2)独立的模块:模块是通过module-init-tool中的insmod的程序利用系统调用来挂载的,而所有的初始化数据和函数都是被这个系统调用所使用的,在模块挂载完成并初始化过后,由系统调用来完成对初始化数据和函数所占空间的释放。

所以对于将内核驱动代码中的函数和数据定义为“初始化”时需要注意:不要将驱动定义的文件方法(如 open、read、write、close)或者驱动在实际工作中需要使用的函数和数据定义为“初始化”属性,因为在驱动初始化后这些东东就已经被释放了,如果使用了就会Oops。

  • __weak
也可以通过GCC的"__attribute__((weak))"
变量加上weak时,是弱符号。函数加上weak时,是弱引用,可以不实现。
给函数加上weak属性时,即使函数没定义,函数被调用也可以编译成功。
当有两个函数同名时,则使用强符号(也叫全局符号,即没有加weak的函数)来代替弱符号(加weak的函数)。


一键转换B站M4S缓存为MP4:无需FFMPEG命令的简易工具 本文介绍了一款专为B站用户设计的绿色工具,可将缓存的M4S视频和音频文件一键转换为通用MP4格式。该工具完全图形化操作,无需学习复杂的FFmpeg命令,解决了普通用户处理B站缓存视频的痛点。文章详细讲解了从下载、配置到转换的完整流程,并提供了常见问题排查与安全使用建议,帮助用户高效、安全地管理离线视频内容。 阅读详情

相关推荐

Dify 从入门到精通:第一篇 - 基础介绍与快速上手

Dify是一个开源的低代码平台,旨在简化大型语言模型(LLM)应用的开发流程。本文作为"Dify从入门到精通"系列的首篇,全面介绍了Dify的核心概念、安装步骤和基本使用方法。文章首先解析了Dify的多模型支持、低代码开发等特点,然后详细讲解了基于Docker的安装配置过程,包括系统要求、环境变量设置等。通过创建一个邮件助手应用的实际示例,展示了Dify的可视化工作流设计功能。最后简要介绍了高级特性和最佳实践,为后续深入学习奠定基础。本文为开发者提供了从零开始使用Dify构建AI应用的完

IT深耕十余载,大道之简 1150

C语言__bitwise宏定义

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/dev-tools/sparse.rst

dbitc的博客 974

Windows下QT5.15.2安装MQTT模块全攻略(附分支选择避坑指南)

本文详细介绍了在Windows环境下为QT5.15.2安装MQTT模块的完整流程,包括环境准备、源码获取、编译配置及项目集成等关键步骤。特别针对分支选择、依赖项处理和常见错误提供了实用解决方案,帮助开发者高效完成MQTT模块的安装与调试,适用于物联网开发场景。

weixin_29224589的博客 466

[源码分析][Linux]内核工具Sparse

Sparse

火云的专栏 2364

【分享】ArcGIS实现分子分母等标注实用技巧

前言 标注是显示在地图上的文字信息,是出图中不可或缺的重要元素,为了标注的样式丰富,摆放的位置灵活,因此给制图出图带来不少难度,以下分享几种本人在ArcGIS中的标注方法,实现上下标注、换行标注或分式标注的实用技巧。 普通模式与高级模式 默认为普通模式,勾选高级开启高级模式。 普通二分式标注(普通模式) [DLBM] & vbnewline & [DLMC] 标注效果展示 分行二分式标注(普通模式) [DLBM]& vbnewline & "——————" &

杨港 3万+

从零到一:海外短剧成品系统源码搭建流程详解及APP+H5交付服务

在当今全球化的数字娱乐浪潮中,海外短剧市场以其独特的文化魅力和广阔的受众基础,正逐渐成为内容创作者与平台运营者争相布局的新蓝海。我为了紧跟时代的发展我翻看了大量的文章,偶然间看到了一篇文章点进去发现他们是专业做短剧开发的,总结下来在这篇文章里分享给大家。

liangyill_的博客 909

linux 源码:__bitwise和__force 的作用

翻译过来就是说,凡是被这个修饰的类型,与基础整数类型和其他不是同一个声明里的整数类型都不一样,如果相互赋值会弹警告。参考连接:https://man7.org/linux/man-pages/man1/sparse.1.html。__bitwise和__force 只限于用sparse,编译的时候一点用没有。那就看看__attribute__((bitwise)) 有啥作用吧。第一条不用管, 看 明明两个都是int,相互赋值就弹警告。用__force,定义如下。那如果就想赋值还不弹呢。

RNG_uzi1111111的博客 417

给大一新生的蓝桥杯EDA备赛规划:从电路分析到立创EDA,如何用一年时间高效备赛?

本文为大一新生提供了一份系统的蓝桥杯EDA备赛规划,从电路分析基础到立创EDA实战操作,分阶段指导如何高效备赛。内容涵盖理论学习、软件操作、PCB设计专项提升及冲刺优化策略,帮助学生在一年内全面提升电子设计能力,为竞赛做好充分准备。

weixin_31476015的博客 290

Linux内核研究-内核开发工具-Sparse

Sparse是C语言的语义检查器。 类型检查 "__bitwise"是一个类型属性,所以你需要这么做: typedef int __bitwise pm_request_t; enum pm_request { PM_SUSPEND = (__force pm_request_t) 1, PM_RESUME = (__force pm_request_t)...

金溪的博客 849

Cesium功能集(十二):Cesium中流体仿真

【代码】Cesium功能集(十二):Cesium中流体仿真。

GIS肆月 602

全志F1C100S/F1C200S学习笔记(1)——基础简介及资料

资料: 荔枝派资料下载站 荔枝派github 荔枝派中文论坛 荔枝派DIY-github资料 荔枝派Nano 全流程指南 芒果派 坑网

丨晋丨 1万+

内核工具-Sparse 与 GCC扩展属性__bitwise[转载]

在研究IPV4jiex数据结构

2744

Agentic-Desktop-Pet:构建本地智能桌面助手的架构与实践

智能体(Agent)作为人工智能领域的重要概念,是指能够感知环境、自主决策并执行任务以实现目标的软件实体。其核心原理在于结合感知、决策与执行模块,通过大语言模型(LLM)等推理引擎处理信息并驱动行动。这种架构的技术价值在于将AI的认知能力与具体的操作系统环境深度融合,从而创造出能主动理解用户上下文、提供个性化服务的智能伙伴。在应用场景上,智能体技术正从云端对话机器人向本地化、场景化的桌面助手演进,旨在解决传统自动化工具缺乏智能、而纯聊天机器人脱离操作环境的问题。本文探讨的Agentic-Desktop-Pe

weixin_27210125的博客 623

__bitwise牵出的 内核工具 – Sparse

Sparse是内核代码静态分析工具, 能够帮助我们找出代码中的隐患.

luvzhan的专栏 1499

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Linux驱动模块编写

Linux驱动直接写函数,init,exit不需要想windows指定函数名,但是需要注册函数。用module_init #include <linux/kernel.h> #include <linux/module.h> MODULE_LICENSE ("GPL");//开源协议GPL 或者MIT BSD MODULE_AUTHOR ("TOM");//作者 MOD...

kernweak的博客 1033

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【GCC系列】深入理解Linux内核 -- __init宏定义

本文使用的Linux源码内核版本:Linux 5.10.0 __init宏定义 在Linux的内核源码里,尤其是一些关键的内核函数,会包含__init宏,它是用来做什么的呢? asmlinkage __visible void __init __no_sanitize_address start_kernel(void) 那么,它的作用是什么?先去找下宏定义: 【include/linux/init.h】 #define __init __section(".init.text") __cold __l

诸葛一帆丶的博客 3454

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

内核中的基础知识积累

1、__bitwise typedef int __bitwise suspend_state_t;

iefswang的专栏 2204

buddy伙伴系统

Linux内存管理简述 Linux的内存管理不仅与处理器的架构相关,还要综合考虑性能需求。在Linux内核内存管理的框架中,最底层的page allocator是对物理内存进行管理的模块,负责管理所有的物理内存,分配和释放都是以page为单位,大小是2^N个连续的物理内存页。所有的内存管理都是以page allocator为基础,采用的算法为经典的Buddy(伙伴算法)。 对于UMA架构,比如SMP,只有一个物理内存节点,但是对于服务器的NUMA架构,会有多个物理内存节点。Linux为了管理所有内存节点的物

weixin_44395686的博客 1278

Linux内存管理宏观篇(五)物理内存:页面分配和释放页面

前面我们知道了关于物理页面,以及对于物理内存管理的数据结构 page和zone。接下来看看很关键的内存分配。对于分配是物理内存很关键的知识点。这里涉及到一个大名鼎鼎的伙伴系统算法实现对物理内存的分配,但是这个算法不是linux独有的。......

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1652

GCC特性之__init修饰解析

做底层驱动的人都知道,在driver文件中会经常看见“__init“修饰的代码,那么__init标记有什么意义? 下面我们就来看看。 在GCC拓展的特殊属性中section时会提及这个__init,他所修饰的所有代码都会放到.init.text节中,当初始化结束后就可以释放这部分内存,这样就减少了内存的占用空间。 那...

weixin_33724659的博客 285

linux内核:__user,__kernel,__safe,__force,__iomem

  首先看一下linux内核4.20.1源码: linux/linux/compile_types.h # define __user __attribute__((noderef, address_space(1))) # define __kernel __attribute__((address_space(0))) # define __safe __attribute__((...

RToax 7218

gcc的_init()和__fini()函数

由executable file(ELF)执行过程可知,其在_start会执行libc_start_main 环境变量起始地址 .init(初始化) 启动 main 函数前的初始化工作 .fini(清理) 程序结束前的收尾工作。 Linux 中有特殊函数 _init 和 _fini, 主要是分别用来初始化动态库和关闭的时候做一些必要的处理. 我们可以把自己认为需要的代码放到这两个函数里面, 它们分别在动态库被加载和释放的时候被执行。 具体说, 如果一个动态库里面有一个名字为"_init" 的函数输出,

遇事不决,问春风 2167

Linux内核宏__init/__initdata/__exit

在内核模块编程中,或许会发现有这样的一些特殊关键字__init ,_initdata ,__exit等等,其实这些都是gcc的扩展属性:__init 宏最常用的地方是驱动模块初始化函数的定义处,其目的是将驱动模块的初始化函数放入名叫.init.text的段。当内核启动完毕后,这个段中的内存会被释放掉供其他使用。__initdata宏用于数据定义,目的是将数据放入名叫.init.data的段。其它几...

xiezhi123456的博客 1397

linux驱动-内核中的数据类型

本文将按照以下几点描述: 基本数据类型 字节序 数据对齐 指针检查 链表 基本数类型: 先看下面基本数据类型占用空间情况: 可以看出各体系CPU有差异,而使用u8,u16,u32,u64没有差异。 因此,我们在定义基本数据类型时,要比较清楚一个类型站有几个字节,尽量养成用内核定义的,类似u32这种符号。当然,sizeof()给定一个变量,就可以返回占用空间字节数。在使用类似u32…的只需要保

子木 6665

第三章 函数编程(四)

第三章 函数编程(四) 定义类型、活动模式、试题单位、异常和异常处理、延迟计算

心想事成 1605

linux中__weak关键字的作用

在linux的驱动代码中经常可以看到__weak去修饰一个函数或者变量,大多是用来修饰函数。 它的作用有两个: 1.weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数, 那么编译器就会执...

Deep_l_zh的博客 2902
上一篇: 飞思卡尔DVFS省电模式介绍
下一篇: 七句人生规律
勤奋专注
博客等级 码龄19年 80粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值