点击左上方蓝色“一口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的位数不同而导致溢出。
精彩文章合集
文章推荐
Copyright © 2015-2023 今日汽车网版权所有 备案号:沪ICP备2023005074号-40 联系邮箱:5 85 59 73 @qq.com