2012-04-27 185 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