首页 > 解决方案 > 如何告诉编译器/CPU 在内核空间的代码中背靠背执行指令?

问题描述

我如何告诉编译器不要优化并且不要在两者之间添加任何其他指令,并强制 CPU 背靠背执行它们?

例如,我希望内核模块尽可能快地执行写入(或读取或混合)命令

writel(0, addr);
writel(1, addr);
writel(0, addr);

或者

writel(0, addr1);
writel(1, addr2);
writel(0, addr3);

编辑:

标签: cgcclinux-kernelkernel-module

解决方案


通常,确保特定指令序列连续执行的唯一可靠方法是将所有指令写在一条 asm volatile语句中。

gcc 手册明确说明了这一点(6.47.2.2):

不要期望一系列 asm 语句在编译后保持完全连续,即使您使用的是 volatile 限定符。如果某些指令需要在输出中保持连续,请将它们放在单个多指令 asm 语句中。

我不确定您想到的是什么架构,但特别是对于您的第二个示例,编译器可能需要在每个示例之前做一些工作才能writel将适当的地址放入适当的寄存器中。为了满足您的要求,您希望它预先完成所有工作,我不知道有什么方法可以强迫它这样做。

告诉编译器“不要优化”通常会与您想要的相反。例如,对于您的第一个示例,如果没有优化,编译器可能不会意识到它可以始终保持addr在同一个寄存器中,并且会生成代码以每次重新加载它。


推荐阅读