c语言linux内核开发,Linux 内核源代码的几个C语言技巧
1.#define中使用do{statement}while(0)
保证statement无论在何处都能正确执行一次
2.将链表操作抽象出来,与宿主结果相互独立。所有的链表操作都作用与list_head,然后通过宏
#define list_entry(ptr, type, member)
container_of(ptr, type, member)
获取宿主结构的地址,以前版本的linux的定义稍有不同,不过更能体现精髓:
#define list_entry(ptr, type, member)
((type *)((char *)(ptr)(
unsigned long)(&((type *)0)>
member)))
很精辟,效率也很高,比后来的C++的面向对象的ADT效率高。
3.当一个数据结构被多个“用户”(此处用户指使用数据结构的一切对象)使用时,在内核中实际上只需要分配一个就行了,每个用户只需将指针指这个数据结构就行了。分配函数中,如果此结构还不存在就分配一个,初始化其引用计数器为1,如果存在的话,只需简单地将引用计数器加1就行了。析构函数中,只需将引用计数器减1,如果减到0再释放内存空间。这种技巧的核心在于利用指针实现内存的共享,而内存本身采用引用计数器来记录引用次数。这样可以极大节省空间。 这个技巧貌似在Windows内核中也有使用。
4.使用likely和unlikely来指导gcc对代码进行分支预测的优化。二者的定义为:
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)
c语言linux内核开发,Linux 内核源代码的几个C语言技巧相关推荐
- 挑战360无死角讲解Linux内核 进程管理,调度器的5种实现丨C++后端开发丨C/C++Linux服务器开发丨内核开发丨网络编程
挑战360无死角讲解 进程管理,调度器的5种实现 1. 8500行 CFS是什么 2. RT调度器使用场景 3. IDLE/Dealine调度器 视频讲解如下,点击观看: 挑战360无死角讲解Linu ...
- Linux 内核开发 - Eclipse内核开发环境搭建
翻译这篇文章的时候,我也想过可能会有高手说,内核开发用vi就足够了,还用什么eclipse,当然对于内核中函数特别了解的人确实如此,但是对于新 手,每使用一个函数,就要去查找一下函数的定义,实在是非常 ...
- linux 内核模块开发,Linux内核模块开发(笔记)
Linux内核模块开发(笔记) 作者:扶凯 来源: 扶凯 时间:2011-11-21 00:21:11 人气:249 评论:0 标签: 内核 个人笔记..在不放过来都快找不到了.有空还得好好整理一下了 ...
- linux内核开发_Linux 内核的代码仓库管理与开发流程简介
作者简介:老 U,致力于开源自由软件推广. 原创雄文:由泰晓读者投递的各类社区原创好文. 版权声明:本文最先发表于 "泰晓科技" 微信公众号,欢迎转载,转载时请在文章的开头保留本声 ...
- Android内核开发 Linux C编程调用内核模块设备驱动
本文出处: http://blog.csdn.net/leytton/article/details/52738901 本文目的为Linux系统环境下:1.编写内核模块程序并编译 2.加载内核模块 3 ...
- linux驱动开发扩展--内核启动logo
static struct logo_data {int depth;int needs_directpalette;int needs_truepalette;int needs_cmapreset ...
- linux驱动开发之内核线程
内核经常需要在后台执行一些操作,这种任务就可以通过内核线程(kernle thread)完成--独立运行在内核空间的标准进程.内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm指针被设置 ...
- 简历中linux内核开发,Linux内核中DMI实现简介
1. 配置 在配置内核时,如果选择了CONFIG_DMI选项,会将DMI(Desktop Management interface)功能添加到内核中.此功能代码在drivers/firmware/Dm ...
- Linux内核模块开发常用内核接口
http://pan.baidu.com/s/1sjCqohv 转载于:https://www.cnblogs.com/pengdonglin137/p/3623827.html
最新文章
- 【知识星球】千奇百怪的网络结构板块更新到哪里了?
- 原来带有python又装了一个anaconda有影响吗_anaconda python环境与原有python环境的坑...
- C++ Opengl旋转源码
- CAN笔记(12) 同步
- STL 合集(不断补充)
- ionic4页面常用判断
- 服务器挂存储系统启不,应用服务器重新启动后无法加载多路径软件
- 循环移动(cyclic)
- 008-对象—— 对象$this self parent 内存方式及使用方法讲解
- 【python】matplotlib绘图显示不了中文,且没有SimHei、FangSong等字体
- 简易一键分享到QQ空间
- linux gcc编译优化(O0、O1、O2、O3、Os)学习笔记
- C语言计算数字乘积根,C 乘积根
- codeforces1567B
- 华为mate30是不是鸿蒙系统,这个意味着是不是鸿蒙系统?
- Python 读取excel指定的列
- 在线sql进行Excel表格拆分
- 你的年终总结写了吗?先和百格活动一起康康这些参考总结吧!
- 数据分析---众包任务
- 重新组织数据之十二 :Replace Record with Data Class(以数据类取代记录)
热门文章
- oracle 切割字符串加引号_oracle存储过程中单引号及字符串拼接处理
- 【clickhouse】使用waterdrop将Hive中的数据导入ClickHouse
- 【IDEA】Cause: invalid type code: 8D
- 【Redis】Redis 基础知识 常用命令 命令积累
- 【kafka】flink kafka NullPointerException Timeout position partition could be determined
- 【Maven】log4j-slf4j-impl cannot be present with log4j-to-slf4j
- 【Kafka】Kafka topic 的消费组 出现 CURRENT_OFFSET 为 unknown
- 12-贝叶斯算法(知识准备)
- Java8新特性:使用Stream流递归实现遍历树形结构
- Java8 Stream流式编程,极大解放你的生产力!