编译Linux内核2.6.39.4时出错
我正在进行一个系统调用,计算FCFS调度算法中的平均等待时间 遵循本指南后,我对相关文件进行了更改,并制作了此程序。 现在在编译内核时,它显示了这个错误编译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
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
,或者打开仿真。(不是我的)非常详细地运行:)