1. 程式人生 > >linux常用巨集解析

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裝置號的結構
在這裡插入圖片描述