我如何告诉 compiler/CPU 在内核 space 的代码中背靠背执行指令?

How can I tell the compiler/CPU to execute instructions back to back in kernel space's code?

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

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

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

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

编辑:

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

gcc manual 明确表示 (6.47.2.2):

Do not expect a sequence of asm statements to remain perfectly consecutive after compilation, even when you are using the volatile qualifier. If certain instructions need to remain consecutive in the output, put them in a single multi-instruction asm statement.

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

告诉编译器"not to optimize"通常会完成与您想要的相反的事情。例如,对于您的第一个示例,如果不进行优化,编译器可能不会意识到它可以始终将 addr 保存在同一个寄存器中,并且每次都会生成代码来重新加载它。