linux常用巨集解析
阿新 • • 發佈:2018-11-11
前言
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裝置號的結構