当前位置: 首页 > news >正文

Linux内核驱动基础(一)常用宏定义【转】

转自:http://blog.csdn.net/tommy_wxie/article/details/9427081

 

一: __init和__initdata  ; __exit和__exitdata

__init和__initdata :仅用于模块初始化,在初始化结束后会丢弃,__init用来描述函数__initdata用来描述数据,比如说当内核启动完毕之后会打印如下语句Freeing unused kernel memory: 664k freed,多半就是__init宏和__initdata宏干的

       __exit和__exitdata:会使那些内建到内核的模块省略掉cleanup函数,即被丢弃,但是对于可卸载的模块是没有影响的

 

二:BUG_ON;BUG

     BUG_ON: 其实是一个函数接口,内核中很频繁的看见,一般用来判断内核是否出现问题(致命的问题吧不然也不会让内核panic),如果参数为真的话,证明内核出现了bug,打印BUG信息,然后调用PANIC函数,让系统panic,一下是它的使用说明
if (bad_condition)
     BUG();
或者是更简单的
BUG_ON(bad_condition);

我们可以使用该宏来判断指针是否为空,内核也常常这样使用

 

三:dump_stack

但是有些时候只需要在终端上打印一下栈的回溯信息来帮助我测试,此时可以使用dump_stack()。它只在终端上打印寄存器上下文和函数的跟踪线索,以下是使用说明
if (condition) {
        printk(KERN_DEBUG "kernel debug info\n");
        dump_stack();

}

 

四: likely()/unlikely()

       likely()宏和unlikely()宏: 这两个宏的目的是进行代码的优化,提高系统执行速度他们的功能是一样的,只是性能不一样。likely()用来描述可能性比较大的结果。比如if(likely()) {fun1();}这样会告诉编译器将fun1函数的代码紧跟在后面,而 if(unlikely()) {fun2();}编译器会尽量将fun2()函数的二进制代码不和前边的编译在一起。宏likely和宏unlikely唯一的作用就是选择“将if分支还是else分支放在跳转指令之后,从而优化程序的执行效率,”。 因为likely(x)代表条件表达式x很可能成立,而unlikely(x)代表条件表达式x很可能不成立,当程序员清楚x表达式多数情况成立还是不成立,这样就可使用likely或unlikely,使if分支(else分支)紧跟跳转指令其后,从而在大多数情况下不用执行跳转指 令,避开跳转指令所带来的开销,从而达到优化的目的。通常在驱动中间在检查内核API的返回值时候,可以使用if(unlikely())宏,因为内核API一般是不会出错的。

 

五:ARRAY_SIZE

         ARRAY_SIZE(x) :该宏是一个很简单的宏,用来计算数组有多少个元素的
ARRAY_SIZE(x) = sizeof(x)/sizeof(x[0]);我们一般会这样定义数组
 Struct data x[] = {
             {},
             {},

};一般在板卡的BSP信息中间定义

 

六: BIT(x)

         BIT(x):该宏是一个很常用的宏,在设置寄存器的时候必须使用BIT(x) = (1<<x)

在设置寄存器的时候我们经常这样设置,这样可以很明显的知道设置了寄存器的哪一位

 

七:  __attribute__((packed))

         __attribute__((packed)) :该宏用来限制结构体对齐的.主要用于跨平台使用,毕竟某
些处理器平台,内存对齐方式不一样
看如下代码 struct data {
                          char a; 
                          int  b;
                     } __attribute__((packed));

因为使用了__attribute__((packed)宏,所以结构体c的大小是5字节如果没有使用该宏,则结构体c的大小是8字节。使用该宏会影响性能.

 

八: PAGE_ALIGN(x)
             PAGE_ALIGN(x):作用是给一个虚拟地址返回一个页对齐的虚拟地址,以下是此宏的定义#define PAGE_ALIGN(addr) -(((addr)+PAGE_SIZE-1) & PAGE_MASK)  
计算地址addr以2K为倍数的下界地址。

             put_user()和get_user(); get_user(value,ptr)将ptr所指的用户区变量读入value变量(不是指针)中。比如get_user(value, (unsigned long  __user *)arg);put_user(value,ptr)将变量value的值读入指针所指用户变量中去比如put_user(value,(unsigned long __user *)arg);这两个宏一般在ioctl方法中使用,用于内核和用户空间传递基本的变量,这两个宏会调用access_ok()来进行地址检查,操作成功返回0。如果涉及到结构体的传递可以使用copy_to_user或者copy_form_user()。













本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/4819610.html,如需转载请自行联系原作者

相关文章:

  • xshell使用xftp传输文件、使用pure-ftpd搭建ftp服务
  • hibernate增删改
  • maven学习:jetty插件与Tomcat插件
  • 聊下 git 多账户问题
  • Datanode Hang with High thread blocked
  • 安装heartbeat
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • 菜鸟学Linux 第065篇笔记 nfs
  • 更改INSM地址的操作
  • centos 7 yum安装kubernetes cluster 1.0
  • C++字符串string类常用操作详解(一)【初始化、遍历、连接】
  • Java设计模式圣经连载(03)-抽象工厂模式
  • Centos中文乱码问题的解决。
  • Python函数知识汇总-课堂笔记
  • AD与DNS集成,且有备份AD与DNS,主AD与DNS坏,备份DNS如何成为主
  • 08.Android之View事件问题
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Apache的80端口被占用以及访问时报错403
  • Electron入门介绍
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Hibernate【inverse和cascade属性】知识要点
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • jquery ajax学习笔记
  • SQLServer之创建显式事务
  • 爱情 北京女病人
  • 从0到1:PostCSS 插件开发最佳实践
  • 服务器之间,相同帐号,实现免密钥登录
  • 欢迎参加第二届中国游戏开发者大会
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 昨天1024程序员节,我故意写了个死循环~
  • ​Java并发新构件之Exchanger
  • ( 10 )MySQL中的外键
  • (Forward) Music Player: From UI Proposal to Code
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十) 初识 Docker file
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .bat批处理出现中文乱码的情况
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net反编译的九款神器
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .Net下的签名与混淆
  • .so文件(linux系统)
  • /bin/bash^M: bad interpreter: No such file or directory
  • @ComponentScan比较
  • [ 转载 ] SharePoint 资料
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用