0

我正在做一个 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,来自第三个数据的所有值都为零。在所有情况下,只有前两个值被正确复制。这种奇怪行为的原因是什么?

4

1 回答 1

0

至少更正copy_from_user调用(复制整个index条目):

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(int))*index))
    {
            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直接传递,而不是指向它的指针(除非你必须以某种方式修改它):

asmlinkage long sys_set_wcet_val(int* wcet_val, int num_values)
{
    int retval=0, loop_index;
    int *wcet_ptr=NULL;
    wcet_ptr = kmalloc(((sizeof(int))*num_values), GFP_ATOMIC);
    if(!wcet_ptr)
            printk("kmalloc:Error in allocating space..\n");
    if (copy_from_user(wcet_ptr, wcet_val, (sizeof(int))*num_values))
    {
            printk("Syscall-wcet_val failed to copy data..\n");
    }
    for(loop_index=0;loop_index<num_values;loop_index++)
            printk("wcet_ptr value is %d\n",*(wcet_ptr+loop_index));
    kfree(wcet_ptr);
    return retval;
}

称它为ret = set_wcet_val(ptr, num_values);.

但我认为您能做的最好的事情就是摆脱系统调用并改用 kobject。寻找kobject_create_and_add, sysfs_create_group, struct attribute_group.

于 2014-07-04T16:06:00.797 回答