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语言技巧相关推荐

  1. 挑战360无死角讲解Linux内核 进程管理,调度器的5种实现丨C++后端开发丨C/C++Linux服务器开发丨内核开发丨网络编程

    挑战360无死角讲解 进程管理,调度器的5种实现 1. 8500行 CFS是什么 2. RT调度器使用场景 3. IDLE/Dealine调度器 视频讲解如下,点击观看: 挑战360无死角讲解Linu ...

  2. Linux 内核开发 - Eclipse内核开发环境搭建

    翻译这篇文章的时候,我也想过可能会有高手说,内核开发用vi就足够了,还用什么eclipse,当然对于内核中函数特别了解的人确实如此,但是对于新 手,每使用一个函数,就要去查找一下函数的定义,实在是非常 ...

  3. linux 内核模块开发,Linux内核模块开发(笔记)

    Linux内核模块开发(笔记) 作者:扶凯 来源: 扶凯 时间:2011-11-21 00:21:11 人气:249 评论:0 标签: 内核 个人笔记..在不放过来都快找不到了.有空还得好好整理一下了 ...

  4. linux内核开发_Linux 内核的代码仓库管理与开发流程简介

    作者简介:老 U,致力于开源自由软件推广. 原创雄文:由泰晓读者投递的各类社区原创好文. 版权声明:本文最先发表于 "泰晓科技" 微信公众号,欢迎转载,转载时请在文章的开头保留本声 ...

  5. Android内核开发 Linux C编程调用内核模块设备驱动

    本文出处: http://blog.csdn.net/leytton/article/details/52738901 本文目的为Linux系统环境下:1.编写内核模块程序并编译 2.加载内核模块 3 ...

  6. linux驱动开发扩展--内核启动logo

    static struct logo_data {int depth;int needs_directpalette;int needs_truepalette;int needs_cmapreset ...

  7. linux驱动开发之内核线程

    内核经常需要在后台执行一些操作,这种任务就可以通过内核线程(kernle thread)完成--独立运行在内核空间的标准进程.内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm指针被设置 ...

  8. 简历中linux内核开发,Linux内核中DMI实现简介

    1. 配置 在配置内核时,如果选择了CONFIG_DMI选项,会将DMI(Desktop Management interface)功能添加到内核中.此功能代码在drivers/firmware/Dm ...

  9. Linux内核模块开发常用内核接口

    http://pan.baidu.com/s/1sjCqohv 转载于:https://www.cnblogs.com/pengdonglin137/p/3623827.html

最新文章

  1. 【知识星球】千奇百怪的网络结构板块更新到哪里了?
  2. 原来带有python又装了一个anaconda有影响吗_anaconda python环境与原有python环境的坑...
  3. C++ Opengl旋转源码
  4. CAN笔记(12) 同步
  5. STL 合集(不断补充)
  6. ionic4页面常用判断
  7. 服务器挂存储系统启不,应用服务器重新启动后无法加载多路径软件
  8. 循环移动(cyclic)
  9. 008-对象—— 对象$this self parent 内存方式及使用方法讲解
  10. 【python】matplotlib绘图显示不了中文,且没有SimHei、FangSong等字体
  11. 简易一键分享到QQ空间
  12. linux gcc编译优化(O0、O1、O2、O3、Os)学习笔记
  13. C语言计算数字乘积根,C 乘积根
  14. codeforces1567B
  15. 华为mate30是不是鸿蒙系统,这个意味着是不是鸿蒙系统?
  16. Python 读取excel指定的列
  17. 在线sql进行Excel表格拆分
  18. 你的年终总结写了吗?先和百格活动一起康康这些参考总结吧!
  19. 数据分析---众包任务
  20. 重新组织数据之十二 :Replace Record with Data Class(以数据类取代记录)

热门文章

  1. oracle 切割字符串加引号_oracle存储过程中单引号及字符串拼接处理
  2. 【clickhouse】使用waterdrop将Hive中的数据导入ClickHouse
  3. 【IDEA】Cause: invalid type code: 8D
  4. 【Redis】Redis 基础知识 常用命令 命令积累
  5. 【kafka】flink kafka NullPointerException Timeout position partition could be determined
  6. 【Maven】log4j-slf4j-impl cannot be present with log4j-to-slf4j
  7. 【Kafka】Kafka topic 的消费组 出现 CURRENT_OFFSET 为 unknown
  8. 12-贝叶斯算法(知识准备)
  9. Java8新特性:使用Stream流递归实现遍历树形结构
  10. Java8 Stream流式编程,极大解放你的生产力!