Linux中__init、__devinit等初始化宏
来源:互联网 发布:淘宝抢鞋软件 编辑:程序博客网 时间:2024/05/19 02:40
内核使用了大量不同的宏来标记具有不同作用的函数和数据结构。如宏__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()函数。
· 如果你不确定需不需要添加优化宏则不要添加。
补充:例如,如果要在驱动中使用i2c或者spi总线,那么他们的初始化常常会被赋值为subsys_initcall()等
====================================================================================================
分类: LINUX
- #define __init __section(.init.text) __cold notrace
- #define __initdata __section(.init.data)
- #define __initconst __section(.init.rodata)
- #define __exitdata __section(.exit.data)
- #define __exit_call __used __section(.exitcall.exit)
- static int __init xxx_drv_init(void)
- {
- return pci_register_driver(&xxx_driver);
- }
- __init,标记内核启动时所用的初始化代码,内核启动完成后就不再使用。其所修饰的内容被放到.init.text section中。
- __exit,标记模块退出代码,对非模块无效
- __initdata,标记内核启动时所用的初始化数据结构,内核启动完成后不再使用。其所修饰的内容被放到.init.data section中。
- __devinit,标记设备初始化所用的代码
- __devinitdata,标记设备初始化所用的数据结构
- __devexit,标记设备移除时所用的代码
- xxx_initcall,7个级别的初始化函数
- module_init, module_exit函数所调用的函数,需要分别用__init和__exit来标记
- pci_driver数据结构不需要标记
- probe和remove函数用__devinit和__devexit来标记
- 如果remove使用__devexit标记,则在pci_drvier结构中要用__devexit_p(remove)来引用remove函数
- 如果不确定需不需要添加宏,则不要添加
- Linux中__init、__devinit等初始化宏
- Linux中__init、__devinit等初始化宏
- Linux中__init、__devinit等初始化宏
- Linux中__init、__devinit等初始化宏
- Linux中__init、__devinit等初始化宏
- Linux中__init、__devinit等初始化宏
- Linux中__init、__devinit等初始化宏
- Linux中__init、__devinit等初始化宏
- Linux中__init、__devinit等初始化宏
- Linux中__init、__devinit等初始化宏
- Linux中__init、__devinit等初始化宏
- Linux中__init、__exit 、__devinit等初始化宏
- Linux中__init、__devinit等初始化宏解析和入口函数
- Linux中__init、__devinit等初始化宏解析和入口函数
- Linux中__init、__devinit等初始化宏解析和入口函数
- Linux中__init、__devinit等初始化宏解析和入口函数
- Linux中__init、__devinit等内核优化宏
- 内核初始化优化宏(__init, __devinit)
- 用java实现单链表模拟栈
- unity3d数据存取
- Merge into的使用详解-你Merge了没有
- 【linux】ubuntu 10.10更新源
- c++ 友元关系与继承
- Linux中__init、__devinit等初始化宏
- VC怎样让程序只有一个实例
- android 2.3 调试wm8960注意事项
- Android下修改SeekBar样式
- JQuery和Struts实现Ajax文件上传
- 关于BIEE中提示器的使用技巧
- SQL中的left outer join,inner join,right outer join用法详解
- java去空格引出的ASCII十六进制无聊事件
- pomelo iOS/Cocos2d客户端iOS6跑不起来解决办法