【问题标题】:Creating structs in linux kernel space在 linux 内核空间中创建结构
【发布时间】:2013-10-30 01:40:23
【问题描述】:

所以我正在为类的 linux 内核做一些工作,我正在尝试实现一个函数,但首先我必须在内核空间中定义一个结构。我收到一个错误,但我不太确定原因。

我认为它与我在开始时定义的结构有关,但我似乎找不到任何问题。

更新:好的,我已经解决了其中一个问题。因此,我将更新我的代码 sn-p 并标记错误中指定的行。第 24 行是结构体末尾之后的行。

这是我正在做的事情:

#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/klist.h>
#include <linux/errno.h> 
#include <asm/uaccess.h>
#include <linux/slab.h>


/********************************************
 *This function adds a new item to the queue
 *
 *If not enough memory return -ENOMEM
 *If there is an error accessing the upper space point return -efault
 *If len is negative return -EINVAL
 *Returns 0 on success 
 ******************************/
struct dataNode
{
  const void * data;
  int length;
  struct list_head * mylist;
}

asmlinkage long sys_writeMsgQueue421(const void __user *data, long len)  //**Line 24**//
{
  newNode->data = pdata;

  newNode->length = len;

  //****Need to add to the linked list****//

  printk("This was passed in: %p and %ld \n",data , len);


  return 0;
}


asmlinkage long sys_readMsgQueue421(void)
{

  printk("This is the read function!\n");
  return 0;
}

asmlinkage long sys_emptyMsgQueue421(void)
{
  printk("This is the clear function!\n");
  return 0;
}

当我运行 make 命令时出现以下错误:

CC msgQueue421/msgQueue421.o msgQueue421/msgQueue421.c:24:1: 警告:“regparm”属性仅适用于函数类型 [-Wattributes] msgQueue421/msgQueue421.c:24:12: 错误: 预期‘;’, 标识符或‘(’在‘long’之前 make[1]: * [msgQueue421/msgQueue421.o] 错误 1 ​​生成:* [msgQueue421] 错误 2

知道我做错了什么吗?

【问题讨论】:

  • 如果您的第二个 malloc 失败,您应该从第一个 malloc 中释放指针。
  • 请在您的代码中添加注释以突出显示第 24 行和第 73 行(您有错误的行)
  • 上线,“newNode->data = data;”您可能打算分配 pdata

标签: c linux struct linux-kernel


【解决方案1】:

您现在遇到的问题(因为还有其他问题,其中一些已经被指出)是您缺少 ; 来关闭您的 struct 声明:

struct dataNode
{
void *data;
int length;
struct list_head * mylist;
}

asmlinkage long sys_writeMsgQueue421(const void __user *data, long len)

编译器尝试解析此代码,认为asmlinkage long ... 等是变量名称,将成为struct dataNode 的实例。当然,asmlinkage 几乎可以肯定是一个扩展为谁知道什么的宏,而long 是一个不能作为变量名的保留字。

所以你会得到错误。很多很多的错误。

一般来说,当您在N 行遇到错误并且您发现该行没有任何问题时,请始终查看错误之前的最后几行代码,看看是否缺少某些内容。

【讨论】:

    【解决方案2】:

    很高兴知道第 24 + 73 行是什么,但 'const' 可能是由

      newNode->data = data;
    

    您想在此处分配 pdata(而不是 __user 指针)。

    对第一个错误组的盲目猜测:缺少#include,因此未定义__user。

    顺便说一句:

    struct list_head * mylist;
    

    在您的严格中很可能是错误的,因为您不能取消引用它。使用普通的struct list_head mylist; 而不是

    【讨论】:

      猜你喜欢
      • 2019-03-24
      • 2011-05-14
      • 2015-12-12
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 2012-05-12
      • 2014-06-18
      • 1970-01-01
      相关资源
      最近更新 更多