linux常用宏解析

前言
linux内核源码里有很多宏,为了能更好地理解内核和驱动源码,有必要对一些常用宏做一个梳理和解析,在此专门做一篇博文来帮助学习,并在以后的学习中逐步添加和完善。

正文

1._IOR(type,nr,size)
用法:

 #define GPIO_IOC_MAGIC					'G'

#define IOCTL_GPIO_GETVALUE				_IOR(GPIO_IOC_MAGIC, 3, int)

宏解析:

#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
->>
#define _IOC(dir,type,nr,size) \
(((dir) << _IOC_DIRSHIFT) | \
((type) << _IOC_TYPESHIFT) |
((nr) << _IOC_NRSHIFT) |
((size) << _IOC_SIZESHIFT))

#ifndef _IOC_READ
#define _IOC_READ 2U
#endif
->>

#define _IOC(dir,type,nr,size) \
(((dir) << 30) | \
((type) << 8) |
((nr) << 0) |
((size) << 16))

由上分析可知_IOC宏把四个参数拼成了一个32位的数字,该数字的组成如下
在这里插入图片描述
所以#define IOCTL_GPIO_GETVALUE _IOR(GPIO_IOC_MAGIC, 3, int)语句设置IOCTL_GPIO_GETVALUE的值为
在这里插入图片描述

2.MKDEV,MAJOR,MINOR
定义:

#define MINORBITS	20
#define MINORMASK	((1U << MINORBITS) - 1)

#define MAJOR(dev)	((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev)	((unsigned int) ((dev) & MINORMASK))
#define MKDEV(ma,mi)	(((ma) << MINORBITS) | (mi))

所以dev设备号的结构
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36412526/article/details/83628234