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カーネルの特別なケースです。

具体的には、カーネルの基本的なルールの1つは、絶対に必要な場合を除いて、FPUの使用を避けることです。そこで言われていることを拡張するには:

FPUコンテキストは保存されません。ユーザーコンテキストであっても、FPUの状態はおそらく現在のプロセスに対応していません。ユーザープロセスのFPUの状態を台無しにすることになります。本当にこれを実行したい場合は、完全なFPU状態を明示的に保存/復元する必要があります(コンテキストスイッチを回避します)。一般的には悪い考えです。最初に固定小数点演算を使用します。

要するに、この質問とその回答で説明されているように、カーネルはCPUにCPUレジスタのコンテキスト切り替えを気にしないように要求します。したがって、プロセスでコンテキストスイッチが実行されると、次に実行するアプリケーションがFPUレジスタを保持して変更できるようになります。その後、変更された状態に戻ります。良くない。

自分でfpuを有効にすることができ、プリエンプトkernel_fpu_begin()セーフです。ただし、コードがプリエンプト可能になることも無効になり、クリティカルセクションに強制されるためkernel_fpu_end()、できるだけ早くする必要があります。

于 2012-04-27T12:24:19.630 に答える