2012-04-27 138 views
0

我正在进行一个系统调用,它计算FCFS调度算法中的平均等待时间。编译Linux内核时出错2.6.39.4

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

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; 
} 

谁能解释一下问题出在哪里?

回答

1

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

1

作为你已经说过的答案,浮点是Linux内核的特例。

具体而言,one of the basic rules of the kernel是为了避免使用FPU,除非你绝对必须。要扩展在那里说什么:

FPU上下文不保存;即使在用户上下文中,FPU状态可能也不会与当前进程相对应:您可能会混淆某些用户进程的FPU状态。如果你真的想这样做,你必须明确地保存/恢复完整的FPU状态(并避免上下文切换)。这通常是一个糟糕的主意;首先使用定点算术。

简而言之,如this question及其答案所述,内核要求CPU不要打扰上下文切换CPU寄存器。因此,如果您的进程经历了上下文切换,下一个要运行的应用程序将能够保存并修改您的FPU寄存器。然后你会回到修改后的状态。不好。

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

+0

因此,如果我在开始时添加kernel_fpu_begin(),并在我的程序 – user1263375 2012-04-27 12:42:02

+0

@ user1263375的末尾添加kernel_fpu_end(),那么我的系统调用就会不起作用 - 您还可能需要调整内核配置,以便最终完成'-mhard-float',或者开启模拟。 [这篇博文](http://www.linuxsmiths.com/blog/?p=253)(不是我的)非常好地运行细节:) – 2012-04-27 12:47:44