编译Linux内核2.6.39.4时出错

编译Linux内核2.6.39.4时出错,linux,linux-kernel,system-calls,Linux,Linux Kernel,System Calls,我正在进行一个系统调用,计算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

我正在进行一个系统调用,计算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
这是我的节目

#包括
ASM长系统atvfcfs(int at[],int bt[],int n)
{
int i=0;
int j,t,wt[n],和,q;
浮动avgwt;
对于(j=i+1;jat[j])
{
t=at[i];
at[i]=at[j];
at[j]=t;
q=bt[i];
bt[i]=bt[j];
bt[j]=q;
}
}
wt[0]=0;
总和=0;

对于(i=0;iGoogle for“linux内核浮点用法”。这是一件特殊的事情。如果可以避免使用浮点类型,请避免使用它。

正如您已经得到的答案所说,浮点是linux内核的一种特殊情况

具体来说,就是要避免使用FPU,除非你必须这样做。要详细说明上面所说的内容:

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

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


您可以使用
kernel\u fpu\u begin()
自己启用fpu,事实上确实如此。但是,它也会禁止您的代码被抢占,并迫使您进入一个关键部分,因此您必须尽快
kernel\u fpu\u end()

如果我在开头和kernel\u fpu\u end()中添加kernel\u fpu\u begin(),那么我的系统调用会起作用吗在我生命的最后program@user1263375不完全正确-您可能还需要调整内核配置,以便最终使用
-mhard float
,或者打开仿真。(不是我的)非常详细地运行:)