点击左上方蓝色“一口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中,从而提升性能。
在标准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
在Linux内核代码中,我们经常会看到一些数字的定义使用了UL后缀修饰。
数字常量会被隐形定义为int类型,两个int类型相加的结果可能会发生溢出。
因此使用UL强制把int
类型数据转换为unsigned long
类型,这是为了保证运算过程不会因为int
的位数不同而导致溢出。
精彩文章合集
文章推荐