首先,贴上源代码:
#define MINORBITS 20
#define MINORMASK ((1U << MINORBITS) - 1)
#define MAJOR(dev) ((unsigned int)((dev) >> MINORBITS))
#define MINOR(dev) ((unsinged int)((dev) & MINORMASK))
#define MKDEV(ma, mi) (((ma) << MINORBITS) | (mi))
MAJOR很好理解,就是将一个32位整数右移20位,剩下高12位,将这高12位作为一个新的整数;
那么怎么将32位整数中的低20位取出来作为一个新的整数呢?我们很容易想到将这个32位整数与000000000000ffffffffffffffffffff(高12位为0,低20位为f)相与即可。
那么怎么来得到这么一个数(000000000000ffffffffffffffffffff)呢?宏MINORMASK就实现了这个目的。
MINORMASK是将1左移20位,再减1,其实你可以算一下,就是把低20位变成了全f,剩下的位仍然为0。
MKDEV就是将两数拼成一数,比较常用的做法。