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

"linux kernel float usage"のGoogle。それは特別なことです。浮動小数点型の使用を避けることができれば、避けてください。

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()を追加し、プログラムの最後にkernel_fpu_end()を追加すると、私のシステムコールが機能します – user1263375

+0

@ user1263375 - あなたはカーネル設定を微調整して終了する必要があるでしょう'-mhard-float'を実行するか、エミュレーションをオンにします。 [このブログの記事](http://www.linuxsmiths.com/blog/?p=253)(私のものではない)は細部まで非常にうまく走っています:) –

関連する問題