转自: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()。

Linux内核驱动基础(一)常用宏定义【转】的更多相关文章

  1. linux内核自锁旋spinlock常用宏解释

    转自:http://blog.sina.com.cn/s/blog_6929134b0100tdn8.html 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持, ...

  2. linux内核源码中常见宏定义

    http://blog.csdn.net/yangdelong/article/details/5508057

  3. 盘点Linux内核源码中使用宏定义的若干技巧(1)

    http://blog.chinaunix.net/uid-23769728-id-3141515.html

  4. Linux内核驱动学习(六)GPIO之概览

    文章目录 前言 功能 如何使用 设备树 API 总结 前言 GPIO(General Purpose Input/Output)通用输入/输出接口,是十分灵活软件可编程的接口,功能强大,十分常用,SO ...

  5. linux 内核驱动--Platform Device和Platform_driver注册过程

    linux 内核驱动--Platform Device和Platform_driver注册过程 从 Linux 2.6 起引入了一套新的驱动管理和注册机制 :Platform_device 和 Pla ...

  6. 【引用】Linux 内核驱动--多点触摸接口

    本文转载自James<Linux 内核驱动--多点触摸接口>   译自:linux-2.6.31.14\Documentation\input\multi-touch-protocol.t ...

  7. 嵌入式C语言自我修养 02:Linux 内核驱动中的指定初始化

    2.1 什么是指定初始化 在标准 C 中,当我们定义并初始化一个数组时,常用方法如下: ] = {,,,,,,,,}; 按照这种固定的顺序,我们可以依次给 a[0] 和 a[8] 赋值.因为没有对 a ...

  8. linux内核驱动模型

    linux内核驱动模型,以2.6.32内核为例.(一边写一边看的,有点乱.) 1.以内核对象为基础.用kobject表示,相当于其它对象的基类,是构建linux驱动模型的关键.具有相同类型的内核对象构 ...

  9. Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

    1. openSUSE是一款优秀的linux. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRjYXN0Y3Bw/font/5a6L5L2T/font ...

随机推荐

  1. List does not exist. The page you selected contains a list that does not exist. It may have been deleted by another user

    当我在subsite里点击"Add a document",报这个错,后来一看event log: 在AAM里加上一条: 问题搞定:

  2. emwin之点击窗口的无效部分来实现一些功能

    @2018-07-27 触摸屏幕窗口的无效部分实现 Dropdown 部件的折叠操作 > 具体代码 case WM_TOUCH: if (pMsg->Data.p) // Somethin ...

  3. 【bzoj2007】 Noi2010—海拔

    http://www.lydsy.com/JudgeOnline/problem.php?id=2007 (题目链接) 题意 $(n+1)*(n+1)$的网格图上,相邻两点间有一些人流.左上角点的海拔 ...

  4. Ubuntu下安装nfs服务器

    安装 NFS 软件包在 ubuntu 终端输入下面命令安装 NFS 服务器:vmuser@Linux-host: ~$ sudo apt-get install nfs-kernel-server # ...

  5. JSP+MySQL中文乱码

    问题:JSP页面传输到MySQL数据库时,中文为乱码(数据库中存储乱码). 解决办法: 1.将所有的涉及到编码的都设置为 utf8(utf-8). 设置数据库编码:命令行执行:mysql> sh ...

  6. (大数)Computer Transformation hdu1041

    Computer Transformation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/ ...

  7. MySQL索引原理及慢查询优化-来自美团网的技术blog(写的深入浅出)

    MySQL索引原理及慢查询优化 转:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首 ...

  8. InfluxDB、grafana、collect部署监控(centos6.8)

    collect部署 1.安装 yum install collectd -y 2.配置/etc/collectd.conf LoadPlugin network <Plugin network& ...

  9. P4315 月下“毛景树”

    P4315 月下"毛景树" 题目描述 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里. 爬啊爬~爬啊爬 ...

  10. Database in BioInformation

    很多数据库都可以通过下面的网站下载:http://annovar.openbioinformatics.org/en/latest/user-guide/download/ 一.NHLBI-ESP(E ...