//用宏定义将32位数x的第n位(bit0为第1位)置位 #define SET_BIT_N(x,n) (x | (1U<<(n-1))) //用宏定义将32位数x的第n位(bit0为第1位)清零 #define CLEAR_BIT_N(x,n) (x & (~(1U<<(n-1))) //用宏定义将32位数x的第n位到第m位(bit0为第1位)置位 #define SET_BITS_N_M(...
宏__GNUC__和__GNUC_MINOR__是 gcc 的预定义宏,用来表示 gcc 版本,详见Common Predefined Macros。 可以看到,如果 gcc 版本小于 4.1,宏BITOP_ADDR(x)扩展后的输出操作数类型修饰符为 "=m","=" 表示该操作数为只写的,"m" 表示操作数位于内存中;否则,扩展为 "+m","+" 表示该操作数为可读写的。另...
在我们的例子中,我们使用bts指令,从位数组中选出一个第一操作数(我们的例子中的nr)所指定的位,存储选出的位的值到CF标志寄存器并设置该位(LCTT 译注:即nr指定的位置为 1)。 注意,我们了解了nr的用法,但这里还有一个参数addr呢!你或许已经猜到秘密就在ADDR。ADDR是一个定义在同一个头文件中的宏,它展开为...
这个DIV_ROUND_UP(nr, d)宏的作用是:如果定义了一个: unsinged long name[128]用作位图的话,则 d = 32bits, 在假设 nr = 128*32 - 1,则n在数组中的下标可以通过 nr / 32 = 127来计算出来,而实际的数组name中有128个元素,所有 DIV_ROUND_UP()函数的作用是将比特位与数组的大小关联起来,可以通过 ...
位数组声明 在我们开始查看位图操作的API之前,我们必须知道如何在 Linux 内核中声明它。有两种声明位数组的通用方法。第一种简单的声明一个位数组的方法是,定义一个unsigned long的数组,例如: unsignedlongmy_bitmap[8] 第二种方法,是使用DECLARE_BITMAP宏,它定义于include/linux/types.h头文件: ...
如果新的段寄存器都改成 32 位的,明明 4G 的内存全部都能访问到,还左移不左移四位呢? 那我们索性就重新定义一把吧。CS、SS、DS、ES 仍然是 16 位的,但是不再是段的起始地址。段的起始地址放在内存的某个地方。这个地方是一个表格,表格中的一项一项是段描述符(Segment Descriptor)。这里面才是真正的段的...
linux C宏定义 写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等。下面列举一些成熟软件中常用得宏定义。。。 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节...
Linux 提供了名为dev_t的数据类型表示设备号,其本质是32位的unsigned int数据类型,其中高12位为主设备号,低20位为次设备号,因此Linux中主设备号范围为0~4095 在文件include/linux/kdev_t.h中提供了几个关于设备号操作的宏定义: #define MINORBITS20#define MINORMASK ((1U << MINORBITS) -1) ...