Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用指针修改结构_C_Function_Pointers_Struct_System Calls - Fatal编程技术网

C 使用指针修改结构

C 使用指针修改结构,c,function,pointers,struct,system-calls,C,Function,Pointers,Struct,System Calls,我有两个职能: 一个是系统调用: asmlinkage long sys_memstats(struct meminfo __user *info){ 其中,我修改meminfo struct中的值,如下所示: info->mFree_pages = tempFreePages; info->mActive_pages =tempActivePages; info->mInactive_pages=tempInactivePages; 并且它没有将正

我有两个职能:

一个是系统调用:

asmlinkage long sys_memstats(struct meminfo __user *info){
其中,我修改meminfo struct中的值,如下所示:

    info->mFree_pages = tempFreePages;
    info->mActive_pages =tempActivePages;
    info->mInactive_pages=tempInactivePages;
并且它没有将正确的值传递到此测试文件中的meminfo结构:

        int main (void){
          struct meminfo *newMemInfo;
          newMemInfo =(struct meminfo*) malloc(sizeof(struct meminfo* ));
          newwMemInfo->mFree_pages =0;
          newMemInfo->mActive_pages=0;
          newMemInfo->mInactive_pages=0;
          int status;
          status = syscall(335, newMemInfo);
         //testPointerParamFunc(newMemInfo);
         printf("Free Pages: %ld \n Active Pages:%ld \n Inactive Pages:%ld ", newMemInfo->mFree_pages, newMemInfo->mActive_pages, newMemInfo->mInactive_pages );
      free(newMemInfo);
      return 0;
    }
因此,我在systemcall测试文件中创建了以下函数,以查看是否正确修改了结构:

void testPointerParamFunc(struct meminfo*  temp){
  temp->mFree_pages =10;
  temp->mActive_pages=21;
  temp->mInactive_pages=12;
}
并在我的代码中调用它(
testPointerParamFunc(newMemInfo);
)而不是系统调用,在运行测试函数时,我得到meminfo结构中这些成员的正确输出:

./test4
Free Pages: 10
 Active Pages:21
 Inactive Pages:12
我对系统调用和函数都使用了相同的指针逻辑,但是在使用系统调用时,newMemInfo没有改变,我仍然得到了与main()中声明的相同的值: /测试4 免费网页:0 活动页面:0 非活动页面:0

我知道:

  info->mFree_pages = tempFreePages;
            info->mActive_pages =tempActivePages;
            info->mInactive_pages=tempInactivePages;
printk(KERN_INFO "TOTAL||||Free pages = %ld | Active Pages: %ld | Inactive Pages: %ld |\n", tempFreePages,tempActivePages,tempInactivePages);
都是有效的
long
类型,因为我在系统调用的内核日志中打印了以下内容:

asmlinkage long sys_memstats(struct meminfo __user *info){
7月30日12:14:54本地主机内核:总计| | | | |免费页面=831134| 活动页面:360990 |非活动页面:715557|

testPointerParamFunc(newMemInfo)
中传递结构指针与在
syscall(335,newMemInfo)
中传递指针有什么区别

我知道_user宏指定指针*信息存在于用户空间中,但它做的不止这些吗

如何更改systemcall参数,以便将这些值传递给指针参数的结构


编辑:美国东部时间7/30/20下午1:18,我修正了malloc只分配一个指针的问题,如@MikeCAT和@Vlad from moscow所建议的,但这似乎不是systemcall不更改结构值的原因,但是测试文件中的测试函数可以。

您不能直接访问
\uu user
内存,但必须通过
复制到用户()
(或
从用户()复制到用户()

asmlong sys\u memstats(struct meminfo\u用户*info)
{
结构记忆库;
/* ... */
res=(结构meminfo){
.mFree_pages=tempFreePages,
/* ... */
};
if(复制到用户(信息、分辨率和分辨率)
返回-默认值;
}

没有很好地阅读您的问题,
newMemInfo=(struct meminfo*)malloc(sizeof(struct meminfo*));
不好,因为只分配了一个指针的大小而不是结构的大小。检查系统调用是否成功。在您的系统中,从用户应用程序访问用户内存的地址值和从内核访问用户内存的地址值是否相同?@MikeCAT Ok我将查看是否将其分配为'newMemInfo=(struct memInfo*)malloc(sizeof(struct meminfo));“为了回答您的第二个问题:系统调用成功,我将它打印到内核日志中,它向我显示“tempFreePages”、“tempActivePages”和“tempainactivepages”的所有值。@MikeCAT”是从用户应用程序访问用户内存的地址值,还是从内核访问用户内存的地址值?”,据我所知,内核内存与用户内存是分开的,因为它们存储在内存中的不同部分。我认为您的回答在这里是正确的。我很难让它工作。而不是'res=(struct meminfo){.mFree_pages=tempFreePages,/*…*/}'我可以只声明meminfo结构变量,如:'res.mFree_pages=tempFreePages'等吗?