`
helloyesyes
  • 浏览: 1306558 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Linux驱动修炼之道-驱动中一些常见的宏

阅读更多

努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/06/02/6462065.aspx

本文档讲解一下驱动中常用的宏,下边一个一个来说,先声明我使用的内核是Linux2.6.30.4。
Linux在arch/$(ARCH)/kernel/vmlinux.lds中定义了.init段,当内核启动完毕,这个段中的内存会被释放掉供其他使用,vmlinux.lds部分内容如下:

一:
只要你写过模块程序hello world就对__init,__exit不会陌生,他们定义在include/linux/init.h中:

__cold在include/linux/compiler-gcc4.h中定义:

所以 #define __init __section(.init.text) __cold notrace等价于#define __init __attribute__((__section(.init.text)))
__atrribute__是一个GNU C扩展,它主要用来声明一些特殊的属性,这些属性主要用来指示编译器进行特定方面的优化和更仔细的代码检查。GNU支持几十个属性,section是其中的一个。通常编译器将函数放在.text节,变量放在.data节或.bss节,使用section属性,可以让编译器将函数或变量放在指定的节中。那么前面对__init的定义便表示将它修饰的代码放在.init.text节。连接器可以把相同节的代码或数据安排在一起,比如__init修饰的所有代码都会被放在.init.text节里,初始化结束后就可以释放这部分内存。一般在程序的结尾都会有一句,例如module_init(hello_init);hello_init就是那个被__init修饰的模块初始化函数,在insmod的时候会调用module_init中的函数。__exit是在模块卸载时相应的内存释放。
下边说一下__initdata,这个我在DMA的源码中看到过,定义在include/linux/init.h中:

看上边的vmlinux.lds,__initdata段也在.init段中,说明初始化后他所修饰的函数占用的内存后会被释放掉。
在阅读RTC源码时遇到的__devinit,__devexit。在include/linux/init.h中定义:

整个.init段释放memory的大小会在系统启动过程中打印出来:

二:
subsys_initcall定义在include/linux/init.h中,定义如下:

这里出现了一个宏__define_initcall,他用于将指定的函数指针放到initcall.init节里,而对于具体的subsys_initcall宏,则是把fn放到.initcall.init的子节.initcall.init里。看上边vmlinux.lds这一部分:

这里__initcall_start指向.initcall.init节的开始,__initcall_end指向它的结尾。而.initcall.init节又被分为几个子节。这个subsys_initcall宏便是将指定的函数指针放在了.initcall4.init子节。

三:
__attribute__((packed));比如下边这个结构体(在include/linux/usb/ch9.h中定义):

这里的__attribute__ ((packed))告诉编译器,这个结构的元素都是1字节对齐的,不要再添加填充位了。如果不给编译器这个暗示,编译器就会依据你的平台类型在结构的每个元素之间添加一定的填充位。

四:

__builtin_expect是GCC里内建的一个函数:

它的第一个参数exp为一个整型的表达式,返回值也是这个exp,它的第二个参数c的值必须是一个编译器的常量,那这个内建函数的意思就是exp的预期值为c,编译器可以根据这个信息适当的重排条件语句块的顺序,将符合这个条件的分支放在合适的地方。对于unlikely(x)就是告诉编译器x发生的可能性不大,那么这个条件块里语句的目标码可能就会被放到一个比较远的位置,以保证经常执行的目标码更紧凑,而likely相反。也就是说,如果你觉得if条件为1的可能性非常大时,可以在条件表达式外面包装一个likely(),如果可能性非常小,则用unlikely()包装。

五:

我们可以通过一个叫container_of的宏反查member所在的数据结构。比如:

使用如下方法可以从数据结构的一个元素出发,得到整个数据结构的指针。

分享到:
评论

相关推荐

    Linux常见驱动源码分析(kernel hacker修炼之道全集)--李万鹏

    Linux驱动修炼之道-驱动中一些常见的宏.pdf Linux驱动修炼之道-内存映射.pdf Linux驱动修炼之道-看门狗框架源码分析.pdf Linux驱动修炼之道-触摸屏驱动之s3c2410_ts源码分析.pdf Linux驱动修炼之道-SPI驱动...

    linux驱动修炼之道-- 李万鹏

    《Linux驱动修炼之道》是李万鹏先生撰写的一本深入探讨Linux驱动程序开发的专业书籍,旨在帮助读者理解和掌握Linux系统下的驱动程序设计与实现。这本书的内容涵盖了从基础概念到高级技术,适合对嵌入式系统、Linux...

    Linux驱动修炼之道-platform

    标题和描述均提到了“Linux驱动修炼之道-platform”,这表明文章的主题聚焦于Linux平台驱动的开发,特别是关于如何理解和操作Linux内核中的platform子系统。平台(Platform)模型是Linux内核用于处理嵌入式系统中...

    Linux驱动修炼之道-clock框架

    ### Linux驱动修炼之道—clock框架解析 #### 一、引言 在Linux内核中,clock框架是管理硬件时钟的重要组成部分。对于嵌入式系统而言,时钟管理至关重要,它直接影响系统的性能与稳定性。本文将详细介绍Linux内核中...

    Linux内核修炼之道-pdf版

    通过《Linux内核修炼之道》,读者不仅能够了解Linux的历史,还能掌握内核分析和驱动开发的技术,从而在Linux世界中游刃有余。这本书不仅是初学者的指南,也是资深开发者的参考资料,对于任何希望深入Linux内核的人来...

    Linux驱动修炼之道

    《Linux驱动修炼之道》这本书是Linux驱动开发领域的经典之作,旨在帮助读者深入理解Linux内核驱动程序的原理和实现,从而提升在Linux系统中的驱动开发技能。以下将围绕标题、描述以及标签,详细阐述Linux驱动的相关...

    常见驱动源码分析(kernel hacker修炼之道)-李万鹏

    这本书是“Linux kernel hacker修炼之道”的一部分,通过深入剖析各种常见的驱动源码,帮助读者提升在Linux系统中的驱动开发能力。 在Linux操作系统中,驱动程序是连接硬件与内核的桥梁,它们负责管理和控制硬件...

    linux驱动修炼之道spi驱动

    ### Linux驱动修炼之道—SPI驱动详解 #### 一、SPI驱动概述 SPI(Serial Peripheral Interface)是一种高速的、全双工、同步的串行通信总线标准,主要用于微控制器与各种外围设备之间的通信。它最初由摩托罗拉公司...

    LINUX内核修炼之道

    LINUX内核修炼之道完整版; 本书重点介绍Linux内核工作原理以及学习方法。将Linux内核的修炼之道总结为四个层次:第一层次目的是对Linux以及内核有个全面的认识和了解,掌握Linux内核源代码的分析方法。第二个层次...

    Linux内核修炼之道.pdf

    ### Linux内核修炼之道知识点概览 #### 一、前言与背景介绍 - **Linux内核的历史背景**:本书开篇介绍了Linux内核的发展历程,涵盖了从1991年至2009年的关键历史事件。这不仅有助于读者理解Linux内核的发展脉络,...

    linux kernel修炼之道

    如果刚刚对linux的kernel有兴趣,想了解点什么的话,请先看看此书吧,她风趣幽默的介绍了linux的发展趣事,让你开心快乐之余慢慢领会linux的魅力,让你了解学习掌握kernel的方法。其中的很多建议经过我的实践和摸索...

    《Linux内核修炼之道》(pdf版).pdf

    《Linux内核修炼之道》是一本深入探讨Linux内核学习与开发的专业书籍,旨在帮助读者理解Linux内核的精髓,掌握内核开发的核心技术。本书不仅涵盖了Linux内核的历史背景,还提供了丰富的学习方法和实战技巧,是每一位...

    Linux内核修炼之道精华版

    《Linux内核修炼之道》是一本深度探讨Linux内核的权威书籍,旨在帮助读者深入了解这个开源操作系统的灵魂。书中的内容涵盖了从内核基础到高级技术的方方面面,为那些希望提升Linux内核理解和开发能力的读者提供了...

    《Linux内核修炼之道》(pdf版)

    《Linux内核修炼之道》(pdf版)是深入探索Linux内核的一本宝贵教程,它不仅提供了详尽的理论知识,还辅以丰富的实践指导,是Linux爱好者和专业人士提升技能的首选读物。本书旨在帮助读者理解Linux内核的运作机制,...

Global site tag (gtag.js) - Google Analytics