linux内核中的特殊用法

__attribute__

对于关键字__attribute__,在标准和C语言中是没有的。它是GCC中对C语言的一个扩展用法。可以用来设置一个函数或数据结构定义的属性,对一个函数设置属性的主要目的是使编译器对函数进行可能的优化。

可以在同一个定义中,设置多个属性,各个属性用逗号分开即可。如下面的定义就是告诉编译器,它不改变全局变量和该函数不能扩展为内联函数。

Int getlim() __attribute__((pure, noinline));

也可以用来设置变量和结构体的成员。如,为了保证结构体中的一个成员变量与结构体有特殊方式的对齐,可以用以下形式定义:

struct mong{

char id;

int code __attribute__((align(4)));

};

 

Typedef

关键字typedef返回的是表达式的类型,使用上类似于关键字sizeof,但它的返回值是类型,而不是一个大小。下面是一些例子:

Char *chptr;//a char pointer

Typedef (*chptr) ch;//a char

Typedef (ch) *chptr2; //a char pointer
 

Asmlinkage和fastcall

Asmlinkage在内核源码中出现的频率非常高,它是告诉编译器在本地堆栈中传递参数,与之对应的是fastcallfastcall是告诉编译器在通用寄存器中传递参数。运行时,直接从通用寄存器中取函数参数,要比在本地堆栈(内存)中取快很多。

 

UL

UL通用用在一个常数后面,标记为unsigned long。 使用UL的必要性在于告诉编译器,把这个常数作为长型数据对待。这可以避免在部分平台上,造成数据溢出。例如,在16位的整数可以表示的范围是-32768-32767;一个无符号整型表示的范围可以达到65536.使用UL可以帮助当你使用大数或长的位掩码时,写出的代码与平台无关。

 

Constvolatile

关键字const的含义不能理解为常量,而是理解为“只读”。

关键字volatile标记变量可以改变,而没有告警信息。Volatile告诉编译器每次访问时,该变量必须重新加载,而不是拷贝或缓存中读取。需要使用volatile的场合有,当我们处理中断寄存器时,或者并发进程之间的共享的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值