0

我正在做一个系统调用来计算 FCFS 调度算法中的平均等待时间。

遵循本指南后,我对相关文件进行了更改并制作了这个程序。现在在编译内核时,它显示此错误。

CC      arch/x86/lib/strstr_32.o
  AS      arch/x86/lib/thunk_32.o
  CC      arch/x86/lib/usercopy_32.o
  AR      arch/x86/lib/lib.a
  LD      vmlinux.o
  MODPOST vmlinux.o
WARNING: modpost: Found 31 section mismatch(es).
To see
 full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
  GEN     .version
  CHK     include/generated/compile.h
  UPD     include/generated/compile.h
  CC      init/version.o
  LD      init/built-in.o
  LD      .tmp_vmlinux1
kernel/built-in.o: In function `sys_atvfcfs':
(.text+0x3e27e): undefined reference to `__floatsisf'
kernel/built-in.o: In function `sys_atvfcfs':
(.text+0x3e286): undefined reference to `__fixsfsi'
make: *** [.tmp_vmlinux1] Error 1

这是我的程序

#include <linux/linkage.h>

asmlinkage long sys_atvfcfs(int at[], int bt[], int n)
{

int i=0;
int j,t,wt[n],sum,q;

float avgwt;


for(j=i+1;j<n;j++)
 {
  if(at[i]>at[j])
   {
    t=at[i];
    at[i]=at[j];
    at[j]=t;
    q=bt[i];
    bt[i]=bt[j];
    bt[j]=q;
   }
 }

wt[0]=0;
sum=0;   

for(i=0;i<n-1;i++)
{

 wt[i+1]=wt[i]+bt[i];
 sum=sum+(wt[i+1]-at[i]);

}

avgwt=sum/n;

return avgwt;
}

谁能解释问题出在哪里?

4

2 回答 2

1

谷歌“linux内核浮动使用”。这是一件特别的事情。如果您可以避免使用浮点类型,请避免使用它。

于 2012-04-27T12:11:18.537 回答
1

正如您已经得到的答案所说,浮点数是 Linux 内核的一个特例。

具体来说,内核的基本规则之一是避免使用 FPU,除非绝对必要。扩展那里所说的内容:

不保存 FPU 上下文;即使在用户上下文中,FPU 状态也可能与当前进程不对应:您会弄乱某些用户进程的 FPU 状态。如果您真的想这样做,则必须显式保存/恢复完整的 FPU 状态(并避免上下文切换)。这通常是一个坏主意;首先使用定点算法。

简而言之,正如这个问题及其答案中所描述的,内核要求 CPU 不要打扰上下文切换 CPU 寄存器。因此,如果您的进程经历了上下文切换,下一个要运行的应用程序将能够持有并修改您的 FPU 寄存器。然后,您将返回修改后的状态。不好。

您可以自己启用 fpu kernel_fpu_begin(),它是preempt-safe。但是,它也会使您的代码无法被抢占并迫使您进入关键部分,因此您必须kernel_fpu_end()尽快这样做。

于 2012-04-27T12:24:19.630 回答