我正在进行系统调用,计算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;
}
有谁可以解释问题出在哪里?
答案 0 :(得分:1)
谷歌“Linux内核浮动使用”。这是一件特别的事。如果可以避免使用浮点类型,请避免使用它。
答案 1 :(得分: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()
。