在linux内核空间中创建结构

时间:2013-10-30 01:40:23

标签: c linux struct linux-kernel

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

我认为它与我在开始时定义的结构有关,但我似乎无法发现任何问题。

更新:好的,我已经解决了其中一个问题。所以我将更新我的代码片段并标记错误中指定的行。第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 make:* [msgQueue421]错误2

知道我做错了什么吗?

2 个答案:

答案 0 :(得分:2)

您现在遇到的问题(因为还有其他问题,其中一些已被指出)是您错过;来关闭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行收到错误并且您认为该行没有任何问题时,请始终查看错误之前的最后几行代码,以查看是否缺少某些内容。

答案 1 :(得分:1)

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

引起的
  newNode->data = data;

你想在这里分配pdata(而不是__user指针)。

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

顺便说一下:

struct list_head * mylist;

在你的严格中很可能是错误的,因为你无法解雇它。使用普通struct list_head mylist;代替