Linux中__init、__devinit等内核优化宏【转】

转自:http://blog.csdn.net/joker0910/article/details/7171626

内核使用了大量不同的宏来标记具有不同作用的函数和数据结构。如宏__init 、__devinit 等。这些宏在include/linux/init.h 头文件中定义。编译器通过这些宏可以把代码优化放到合适的内存位置,以减少内存占用和提高内核效率。

下面是一些常用的宏:

·   __init ,标记内核启动时使用的初始化代码,内核启动完成后不再需要。以此标记的代码位于.init.text 内存区域。它的宏定义是这样的:

· #define _ _init _ _attribute_ _ ((_ _section_ _ (".text.init")))

·   __exit ,标记退出代码,对于非模块无效。

·   __initdata ,标记内核启动时使用的初始化数据结构,内核启动完成后不再需要。以此标记的代码位于.init.data 内存区域。

·   __devinit ,标记设备初始化使用的代码。

·   __devinitdata ,标记初始化设备数据结构的函数。

·   __devexit ,标记移除设备时使用的代码。

·   xxx_initcall ,一系列的初始化代码,按降序优先级排列。

初始化代码的内存结构


_init_begin -------------------
| .init.text | ---- __init
|-------------------|
| .init.data | ---- __initdata
_setup_start |-------------------|
| .init.setup | ---- __setup_param
__initcall_start |-------------------|
| .initcall1.init | ---- core_initcall
|-------------------|
| .initcall2.init | ---- postcore_initcall
|-------------------|
| .initcall3.init | ---- arch_initcall
|-------------------|
| .initcall4.init | ---- subsys_initcall
|-------------------|
| .initcall5.init | ---- fs_initcall
|-------------------|
| .initcall6.init | ---- device_initcall
|-------------------|
| .initcall7.init | ---- late_initcall
__initcall_end |-------------------|
| |
| ... ... ... |
| |
__init_end -------------------

初始化代码的特点是:在系统启动运行,且一旦运行后马上退出内存,不再占用内存。

对于驱动程序模块来说,这些优化标记使用的情况如下:

·   通过module_init() 和module_exit() 函数调用的函数就需要使用__init 和__exit 宏来标记。

·   pci_driver 数据结构不需标记。

·   probe() 和remove() 函数应该使用__devinit 和__devexit 标记,且只能标记probe() 和remove()

·   如果remove() 使用__devexit 标记,则在pci_driver 结构中要用__devexit_p(remove) 来引用remove() 函数。

·   如果你不确定需不需要添加优化宏则不要添加。

时间: 2024-10-01 06:33:34

Linux中__init、__devinit等内核优化宏【转】的相关文章

linux中Web服务器Nginx多方位优化策略

Nginx(读音engine x)服务器由于性能优秀稳定.配置简单以及跨平台,被越来越多的公司和个人所采用,现已成为市场份额继Apache之后的第二大Web服务器.各大小网站论坛博客也介绍说明了Nginx从安装到优化的各种配置.不过看了很多这些相关Nginx的文档之后,发现一个比较大的问题,就是这些文档基本也就从两个方面着手,一是修改Nginx的配置文件,二是调整操作系统的相关内核参数:而且文档说明也不够明了,缺乏比较系统级别的优化.本文将从Nginx源码编译安装开始,到修改配置文件,调整系统内

linux中nginx内核参数优化配置

内核参数优化配置 vi /etc/sysctl.conf 添加以下参数设置后运行命令: /sbin/sysctl -p 关于Nginx内核参数的优化: net.ipv4.tcp_max_tw_buckets = 6000 设定timewait的数量,默认是180000. net.ipv4.ip_local_port_range = 1024 65000 允许系统打开的端口范围. net.ipv4.tcp_tw_recycle = 1 启用timewait快速回收. net.ipv4.tcp_tw

Linux 中的 DTrace :BPF 进入 4.9 内核

随着 BPF 追踪系统(基于时间采样)最后一个主要功能被合并至 Linux 4.9-rc1 版本的内核中,现在 Linux 内核拥有类似 DTrace 的原生追踪功能.DTrace 是 Solaris 系统中的高级追踪器.对于长期使用 DTrace 的用户和专家,这将是一个振奋人心的里程碑!现在在 Linux 系统上,你可以在生产环境中使用安全的.低负载的定制追踪系统,通过执行时间的柱状图和频率统计等信息,分析应用的性能以及内核. 用于 Linux 的追踪项目有很多,但是这个最终被合并进 Lin

Linux中的DTrace:BPF进入4.9内核

随着 BPF 追踪系统(基于时间采样)最后一个主要功能被合并至 Linux 4.9-rc1 版本的内核中,现在 Linux 内核拥有类似 DTrace 的原生追踪功能.DTrace 是 Solaris 系统中的高级追踪器.对于长期使用 DTrace 的用户和专家,这将是一个振奋人心的里程碑!现在在 Linux 系统上,你可以在生产环境中使用安全的.低负载的定制追踪系统,通过执行时间的柱状图和频率统计等信息,分析应用的性能以及内核. 用于 Linux 的追踪项目有很多,但是这个最终被合并进 Lin

Linux中不编译内核,如何挂载mount ntfs分区

Linux中不编译内核,如何挂载mount ntfs分区? 找到对应内核版本(uhttp://www.aliyun.com/zixun/aggregation/11696.html">name -a)的ntfsrpm,安装即可.以原装rh8为例,未升级或编译内核1. 上google.com搜索并下载 kernel-ntfs-2.4.18-14.i686.rpm2. rpm -ivh kernel-ntfs-2.4.18-14.i686.rpm3. mkdir /mnt/c4. mount

Linux中如何安装内核源码包?

Linux中如何安装内核源码包? 有些时候,我们需要对系统的内核进行升级操作,我们可以使用rpm命令来完成. 下载新的iso光盘镜像文件,并挂载iso文件到光盘. 把你光盘上的内核源码包装上即可,我们使用如下命令: rpm -i *kernel*source*.rpm

linux中的优先搜索树的实现--prio_tree【转】

转自:http://blog.csdn.net/bailyzheng/article/details/8041943 linux中的优先搜索树的实现--prio_tree prio_tree在linux内核中被应用于反向内存映射,prio-tree是一棵查找树,它查找的是一个区间,为何将之组织成tree是一个数学问题,简单理解就是根节点包含了所有的区间,父节点代表的区间包含了子节点代表的区间,这里的包含不是现实意义的包含,而是heap/radix意义上的包含,只要满足heap的性质以及radix

Linux中select poll和epoll的区别

select的本质是采用32个整数的32位,即32*32= 1024来标识,fd值为1-1024.当fd的值超过1024限制时,就必须修改FD_SETSIZE的大小.这个时候就可以标识32*max值范围的fd. 对于单进程多线程,每个线程处理多个fd的情况,select是不适合的. 1.所有的线程均是从1-32*max进行扫描,每个线程处理的均是一段fd值,这样做有点浪费 2.1024上限问题,一个处理多个用户的进程,fd值远远大于1024 所以这个时候应该采用poll, poll传递的是数组头

Linux系统针对网卡中断的优化处理

中断: 当网卡接收到数据包后,会触发硬中断,通知CPU来收包.硬中断是一个CPU和网卡交互的过程.这其实会消耗CPU资源.特别是在使用速度极快的万兆网卡之后,大量的网络交互使得CPU很大一部分资源消耗在网卡中断处理上.此时,瓶颈并不在网卡,而是在CPU上.因此,现在的网卡都采用多队列的技术,用于充分利用多核心CPU. 中断的详细解释:<Linux的中断和异常扫盲笔记> SMP IRQ affinity 为了防止多个设置发送相同的中断, Linux设计了一套中断请求系统, 使得计算机系统中的每个