Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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 在linux内核空间中创建结构_C_Linux_Struct_Linux Kernel - Fatal编程技术网

C 在linux内核空间中创建结构

C 在linux内核空间中创建结构,c,linux,struct,linux-kernel,C,Linux,Struct,Linux Kernel,因此,我正在为类的linux内核做一些工作,并试图实现一个函数,但首先我必须在内核空间中定义一个结构。我得到一个错误,但我不太确定原因 我假设它与我在开始时定义的结构有关,但我似乎找不到任何问题 更新:好的,我已经解决了其中一个问题。因此,我将更新我的代码片段并标记错误中指定的行。第24行是结构结束后的一行 以下是我正在做的: #include <linux/kernel.h> #include <linux/list.h> #include <linux/klis

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

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

更新:好的,我已经解决了其中一个问题。因此,我将更新我的代码片段并标记错误中指定的行。第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;
}
#包括
#包括
#包括
#包括
#包括
#包括
/********************************************
*此函数用于向队列中添加新项目
*
*如果没有足够的内存返回-ENOMEM
*如果访问上部空间点时出错,返回-efault
*如果len为负返回-EINVAL
*成功时返回0
******************************/
结构数据节点
{
const void*数据;
整数长度;
结构列表_head*mylist;
}
ASMLINK long sys_writeMsgQueue421(常量无效_用户*数据,长长度)//**第24行**//
{
newNode->data=pdata;
newNode->length=len;
//****需要添加到链接列表中****//
printk(“已传入:%p和%ld\n”,数据,len);
返回0;
}
ASMLINK long sys_readMsgQueue421(无效)
{
printk(“这是读取函数!\n”);
返回0;
}
ASM链接长系统\u emptyMsgQueue421(无效)
{
printk(“这是清除函数!\n”);
返回0;
}
当我运行make命令时,出现以下错误:

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


知道我做错了什么吗?

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

  newNode->data = data;
您希望在此处分配
pdata
(而不是用户指针)

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

顺便说一句:

struct list_head * mylist;

在您的strict中,很可能是错误的,因为您无法取消它。请使用普通的
struct list\u head mylist;
而不是您现在遇到的问题(因为还有其他问题,其中一些已经被指出)是缺少一个
来关闭
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
行中遇到错误,并且您认为该行没有任何错误时,请始终查看错误之前的最后几行代码,以查看是否缺少某些内容。

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