c - 如何告诉编译器/CPU 在内核空间的代码中背靠背执行指令?
问题描述
我如何告诉编译器不要优化并且不要在两者之间添加任何其他指令,并强制 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 手册明确说明了这一点(6.47.2.2):
不要期望一系列 asm 语句在编译后保持完全连续,即使您使用的是 volatile 限定符。如果某些指令需要在输出中保持连续,请将它们放在单个多指令 asm 语句中。
我不确定您想到的是什么架构,但特别是对于您的第二个示例,编译器可能需要在每个示例之前做一些工作才能writel
将适当的地址放入适当的寄存器中。为了满足您的要求,您希望它预先完成所有工作,我不知道有什么方法可以强迫它这样做。
告诉编译器“不要优化”通常会与您想要的相反。例如,对于您的第一个示例,如果没有优化,编译器可能不会意识到它可以始终保持addr
在同一个寄存器中,并且会生成代码以每次重新加载它。
推荐阅读
- sharepoint - 从主机访问 SharePoint 提供程序托管列表数据
- javascript - JavaScript 使用 async/await 确保我在实现之前检索值,但仍然返回“未定义”
- c++ - 似乎默认模板参数中的成员访问错误
- python - 这可以被视为一种编程语言吗?
- python - 无法使用 Newton-Raphson 方法获得第四根
- c# - 为什么当玩家在空中按下空格键跳跃时,再次按下空格键会再次跳得更高?
- sql-server - 在 SSMS 中执行多个查询
- python-3.x - AppiumLibrary+Robot 框架 - 在模拟器存储中使用推送文件上传 base64 图像数据时面临问题
- memory-management - 用于估计行缓冲区位置的性能指标/事件
- c# - 如何在作为 Windows 服务托管的 Asp.net 核心应用程序上配置负载均衡器?