我正在做一个 linux 项目。我需要从用户空间程序将整数值列表传递给内核。我为此实现了一个系统调用。在用户空间程序中,我有以下代码。的值num_values
是从命令行参数获得的。
int* ptr=NULL;
ptr = (int*) malloc(sizeof(int)*num_values);
for(loop_index=0;loop_index<num_values;loop_index++)
{
*(ptr+loop_index)=atoi(argv[optind+loop_index]);
}
然后,我调用了我的系统调用,
ret = set_wcet_val(ptr,&num_values);
内核中的系统调用' set_wcet_val
'实现如下:
asmlinkage long sys_set_wcet_val(int* wcet_val, int* num_values)
{
int retval=0, retval2=0, index, loop_index;
int *wcet_ptr=NULL;
retval2 = get_user(index,(int*)num_values);
wcet_ptr = kmalloc(((sizeof(int))*index), GFP_ATOMIC);
if(!wcet_ptr)
printk("kmalloc:Error in allocating space..\n");
if (copy_from_user(wcet_ptr, wcet_val, sizeof(wcet_ptr)))
{
printk("Syscall-wcet_val failed to copy data..\n");
}
for(loop_index=0;loop_index<index;loop_index++)
printk("wcet_ptr value is %d\n",*(wcet_ptr+loop_index));
kfree(wcet_ptr);
return retval;
}
值“ num_values
”已正确复制到“ index
”。问题是我检查时只打印了前两个数据dmesg
。如果num_values
是 3,我将得到第三个数据的随机正值。如果num_values
为 4,则第三个数据为随机正值,第四个数据为负值。对于num_values
> 4,来自第三个数据的所有值都为零。在所有情况下,只有前两个值被正确复制。这种奇怪行为的原因是什么?