首页 > 要闻 >

Linux内核中常用的C语言技巧

2023-08-08 12:34:16 来源:面包芯语
x
点击左上方蓝色“一口Linux”,选择“设为星标”
#defineprefetch(x)__builtin_prefetch(x)#defineprefetchw(x)__builtin_prefetch(x,1)

下面是使用prefetch()函数进行优化的一个例子。


【资料图】

void__init__free_pages_bootmem(structpage*page,unsignedintorder){unsignedintnr_pages=1<

在处理struct page数据之前,通过prefetchw()预取到cache中,从而提升性能。

asmlinkage

在标准C语言中,函数的形参在实际传入参数时会涉及参数存放问题。

对于x86架构,函数参数和局部变量被一起分配到函数的局部堆栈里。x86中对asmlinkage的定义:

asm/linkage.h>#defineasmlinkageCPP_ASMLINKAGE__attribute__((regparm(0)))

attribute((regparm(0))):告诉编译器该函数不需要通过任何寄存器来传递参数,只通过堆栈来传递。

对于ARM来说,函数参数的传递有一套ATPCS标准,即通过寄存器来传递。ARM中的R0~R4寄存器存放传入参数,当参数超过5个时,多余的参数被存放在局部堆栈中。所以,ARM平台没有定义asmlinkage。

#defineasmlinkageCPP_ASMLINKAGE#defineasmlinkageCPP_ASMLINKAGE

UL

在Linux内核代码中,我们经常会看到一些数字的定义使用了UL后缀修饰。

数字常量会被隐形定义为int类型,两个int类型相加的结果可能会发生溢出。

因此使用UL强制把int类型数据转换为unsigned long类型,这是为了保证运算过程不会因为int的位数不同而导致溢出。

精彩文章合集

文章推荐

上一篇 下一篇
x
要闻
动态
精彩推送