1

我试图了解如何在使用 gcc 编译时禁用内核模块的代码优化。我试着给这样的编译指示

#pragma optimize("",off)
void rt_ct_use_cpu(unsigned long long n_cicle){
    unsigned long long i;
    for(i=0;i<n_cicle;i++);
}
#pragma optimize("",on)

但是编译器会发出警告说它将忽略那些编译指示。我还尝试制作一些避免编译器滚动循环的东西

void rt_ct_use_cpu(unsigned long long n_cicle){
    unsigned long long i;
    unsigned long long time=0;
    unsigned long long timebase = rt_get_cpu_time_ns();
    for(i=0;i<n_cicle;i++) {
        time += rt_get_cpu_time_ns();
        time -= timebase;
    }
}

但在这种情况下,cicle 有多长(n_cicle 有多大)并不重要,程序将始终运行相同的时间(几毫秒)

你能帮助我吗?

4

3 回答 3

2

请参阅 GCC pragma 文档6.59.13 Function Specific Option Pragmas ,如#pragma GCC optimize ("O0")

于 2013-12-16T21:35:08.927 回答
1

也许事情已经改变了,但我只是将 -O0 添加到我的内核模块 Makefile 中,它能够构建和运行,我可以用它进行调试,没有任何东西得到优化,调试器可以显示所有变量,并逐行跟踪预期的顺序。

于 2019-12-28T21:56:31.090 回答
1

您不能或至少不应该在 Linux 内核中这样做。至少需要 -O1 以确保内联和其他基本优化器运行。例如,某些汇编代码(如setjmp函数)必须内联,否则它们将无法正确执行。

于 2017-11-05T16:09:16.367 回答