【问题标题】:Dynamic Memory Allocation in Linux Kernel SpaceLinux内核空间中的动态内存分配
【发布时间】:2013-11-06 16:09:12
【问题描述】:

我在分配内存时遇到问题是 Linux 内核空间。我使用以下两个结构创建了一个链表:

struct Node{
    char *ptr;
    struct Node *next;
};

struct List{
    struct Node *head;
    struct Node *tail;
};

现在当我尝试分配一个列表结构[编辑以反映正确的代码]:

struct List *ll = kmalloc(sizeof(struct List), GFP_KERNEL)

我明白了:

error: Initializer element is not constant

我在这里做错了什么?我想在我的 List 结构中添加指向节点的指针,所以我可以通过以下方式添加它们:

struct Node n* = kmalloc(sizeof(Node));
n -> ptr = "Blah";
n -> next = NULL;
ll -> head = n;

【问题讨论】:

  • 我很确定 Linux 内核头文件有一些用于链接列表的宏......参见例如here
  • 谢谢,如果这不起作用,我会检查一下。我早些时候看到了这个,但认为自己编写代码会更容易。 C 吓到我了!
  • 如果你想稍后提交你的代码到内核中,你应该现在使用内核的习惯和编码规则......如果你害怕C 你应该从编写用户级应用程序开始,而不是内核代码。
  • 我不想将它提交到内核中。我希望我可以,但这是课程的要求。
  • 那我希望你的老师要求你遵循内核习惯。所以你需要了解如何将现有的宏用于列表。

标签: c linux memory-management struct kernel


【解决方案1】:

没有

struct List ll*;

但是

struct List *ll;

您在类型定义中是正确的,但在 kmalloc 的两行中都错了。

【讨论】:

  • 我的错误是 struct List *ll;在我的代码中,我一定是把它复制错了。这没有解决我的问题,仍然出现错误。
【解决方案2】:

ERROR与内核编程无关,与c编程有关。

error: Initializer element is not constant

代码:

 struct List{
    struct Node *head;
    struct Node *tail;
};
struct List *ll = kmalloc(sizeof(struct List), GFP_KERNEL)

结构对象(默认)具有静态存储类。 具有静态存储持续时间的对象的初始化必须使用常量表达式。 尝试在 main() 函数中分配内存。

具有静态持续时间的对象要么在函数外部声明,要么在函数内部声明 关键字 extern 或 static 作为声明的一部分。这些只能在编译时初始化。即,使用常量表达式

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 2012-10-08
    • 2013-09-17
    • 1970-01-01
    • 2011-11-29
    • 2014-06-10
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    相关资源
    最近更新 更多