gpt4 book ai didi

c - 将值列表传递到内核空间

转载 作者:行者123 更新时间:2023-11-30 17:31:31 28 4
gpt4 key购买 nike

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

最佳答案

至少更正 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_addsysfs_create_groupstruct attribute_group

关于c - 将值列表传递到内核空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24577836/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com