我如何告诉 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);
编辑:
我将 iowrite32
替换为 writel
,其定义为 volatile void __iomem *addr
addr*
可以分配给 dma_alloc_coherent()
或简单地 ioremap()
.
我的问题不是关于执行顺序(通过内存屏障或 volatile
解决)而是它们之间的延迟。
通过将我的命令组合在一个程序集中可能是可能的asm volatile()
,但我宁愿使用更安全的东西。
通常,确保特定指令序列连续执行的唯一可靠方法是将所有指令写入单个 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
保存在同一个寄存器中,并且每次都会生成代码来重新加载它。
如何告诉编译器不要优化,不要在中间添加任何其他指令,并强制 CPU 背靠背执行它们?
例如我希望内核模块尽可能快地执行写入(或读取或混合)命令
writel(0, addr);
writel(1, addr);
writel(0, addr);
或
writel(0, addr1);
writel(1, addr2);
writel(0, addr3);
编辑:
我将
iowrite32
替换为writel
,其定义为volatile void __iomem *addr
addr*
可以分配给dma_alloc_coherent()
或简单地ioremap()
.我的问题不是关于执行顺序(通过内存屏障或
volatile
解决)而是它们之间的延迟。通过将我的命令组合在一个程序集中可能是可能的
asm volatile()
,但我宁愿使用更安全的东西。
通常,确保特定指令序列连续执行的唯一可靠方法是将所有指令写入单个 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
保存在同一个寄存器中,并且每次都会生成代码来重新加载它。