linux内核驱动基础(1)常用宏定义

linux内核驱动基础(1)常用宏定义

ID:32689156

大小:55.27 KB

页数:5页

时间:2019-02-14

linux内核驱动基础(1)常用宏定义_第1页
linux内核驱动基础(1)常用宏定义_第2页
linux内核驱动基础(1)常用宏定义_第3页
linux内核驱动基础(1)常用宏定义_第4页
linux内核驱动基础(1)常用宏定义_第5页
资源描述:

《linux内核驱动基础(1)常用宏定义》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、_init和_initdata_init宏和函数声明放在一起,表示gcc编译器在编译代码时,需要把这个函数放在.init.textIX段中,内核完成初始化之后,会释放掉该区段—initdata宏和变量声明放在一起,表示gcc编译器在编译代码时,需要把这个变量放在.initdata区段中,内核完成初始化之后,会释放掉该区段内核启动时打印如下语句:freeingunusedkernelmemory:664kfreed表示正在释放.init.text和.init.data等区段_exit和_exitdata_exit和_exitdata宏用

2、来告诉内核如果相关的模块被直接编译进内核(即built-in),则cleanup函数会被省略,不会被链接进入内核镜像,毕竟模块被内置,就不可能卸载,卸载函数也就没有必要存在—exit和—exitdata宏对于可卸载的模块没有任何影响ARRAY.SIZE(x)该宏用来计算数组的成员数,定义如下ARRAY_SIZE(x)=sizeof(x)/sizeof(x[0]);BIT(x)该宏用来设置寄存器,定义如卜’BIT(x)=(l«x)使用BIT(x)宏的好处是可以很明显的知道设置了寄存器的哪一位Iikely()和unlikely()这两个宏

3、的目的是优化代码,提高系统执行速度必须明确的是likely()和unlikely()从阅读和理解的角度是一样的,即if(likely(value))等价于if(value)if(unlikely(value))等价于if(value)宏的定义如下:#definelikely(x)_builtin_expect(!!(x),1)#defineunlikely(x)_builtin_expect(!!(x),0)—built_expect()函数是gcc内建函数,目的是将分支转移的信息提供给编译器,方便编译器优化代码,从而减少指令跳转带来

4、的性能下降—buildin_expect(!!(x),1)表示x的值为真可能性更大—buildin_expect(!!(x),0)表示x的值为假可能性更大即使用likelyO,执行讦后面的代码机会更大而使用unlikely(),执彳亍else后面的代码机会更大通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟前面的代码,从而减少指令跳转带來的性能下降,看如下代码:ret二kmalloc(1024,GFP_KERNEL);if(unlikely(ret==NULL)){funl();}unlikely()的作用是告诉编译器ret

5、==NULL的可能性很小,编译器在编译时,funl(啲二进制代码尽量不要和前面程序(kmalloc)编译在一块_attribute_((packed))该宏用来限制结构体对齐,跨平台时使用.由于不同的处理器平台,其内存对齐方式不一样,为了跨平台传递数据,此时就需要限制结构体对齐,看如下代码:structdata{chara;intb;}_attribute_((packed));由于使用—attribute_((packed)宏,该结构体的大小是5字节,如果没有使用该宏,则结构体的大小是8字节•当然使用该宏会影响系统性能PAGE_AL

6、IGN(addr)该宏用来对地址addr做页边界对齐,定义如下:#definePAGE_ALIGN(addr)(((addr)+PAGE_SIZE・l)&PAGE_MASK)例如PAGE_ALIGN(0x22000001)=0x22001000例如PAGE_ALIGN(0x22000003)=0x22001000上述实例可知,该宏用来对地址addr做页边界对齐,注意是和下一个页的边界对齐页大小为4K字节get_user()和put_user()get_user()和put_user()是两个函数,主要用于内核空间和用户空间拷贝简单变量

7、(比如char、int>long),如果涉及到结构体或者数组的传递则可以调用copy_from_user()或者copy_to_user()get_user(val,(int*)arg)用户・>内核,arg是用户空间的地址put_user(val,(int*)arg)内核・>用户,arg是用户空间的地址get_user()和put_user()函数都会调用access_ok()来检查地址合法性,操作成功返刨0,否则返回负值当然copy_from_user()和copy_to_user()也会进行地址检查IO_ADDRESS()该宏的作

8、用和ioremap函数的作用类似,为芯片寄存器进行虚拟映射,使用该宏的返回值可以访问芯片寄存器arch_is_coherent表示硬件架构是否支持cache一致性,比如arm架构芯片不支持cache-致性,需要软件支持,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。