Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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_Data Structures_Linux Kernel_Kernel - Fatal编程技术网

C 在内核空间中存储结构数组,Linux

C 在内核空间中存储结构数组,Linux,c,linux,data-structures,linux-kernel,kernel,C,Linux,Data Structures,Linux Kernel,Kernel,我相信我可能有点过虑了这个问题。。。我的文件系统中有一个文本文件,我在启动时对其进行解析,并将结果存储到一个结构数组中。我需要将这个数组从用户空间复制到内核空间(从用户复制),并且必须让内核随时可以访问这些数据。内核空间中的数据需要通过Sockets.c文件访问。在内核空间中是否有存储数组的特殊位置,或者我可以简单地在Sockets.c中添加对数组的引用?我的C有点生锈了 谢谢你的建议。你可以在内核的某个地方定义一个extern指针(比如,在你要使用它的sockets.c文件中)。将其初始化为N

我相信我可能有点过虑了这个问题。。。我的文件系统中有一个文本文件,我在启动时对其进行解析,并将结果存储到一个结构数组中。我需要将这个数组从用户空间复制到内核空间(从用户复制),并且必须让内核随时可以访问这些数据。内核空间中的数据需要通过Sockets.c文件访问。在内核空间中是否有存储数组的特殊位置,或者我可以简单地在Sockets.c中添加对数组的引用?我的C有点生锈了


谢谢你的建议。

你可以在内核的某个地方定义一个
extern
指针(比如,在你要使用它的
sockets.c
文件中)。将其初始化为
NULL
,并在某些适当的头文件中包含声明

在执行
copy\u from\u user()
的代码部分,使用
kmalloc()
为数组分配空间,并将地址存储在指针中。将数据复制到其中。您还希望在访问阵列时锁定互斥锁


kmalloc()
分配的内存将一直保留,直到使用
kfree()
释放为止。您的问题非常基本且模糊,我建议您完成中的一些练习。第8章的全部内容都致力于分配内核内存。

我认为问题有两个主要部分:

  • 将数据从用户空间传递到内核空间

  • 将数据存储在内核空间中

对于第一个问题,我建议使用Netlink套接字,而不是更传统的系统调用(读/写/ioctl)接口。Netlink套接字允许使用类似套接字的接口将配置数据传递到内核,这样使用起来更简单、更安全

您的程序应该执行所有的输入解析和验证,然后将数据传递给内核,最好是以比海量数据块更结构化的形式(例如逐条输入)

除非您对高吞吐量(每秒兆字节的数据)感兴趣,否则netlink接口很好。以下链接提供了说明和示例:

就阵列存储而言,如果计划存储超过128KB的数据,则必须使用vmalloc()来分配空间,否则最好使用kmalloc()。您应该阅读Linux设备驱动程序手册的相关章节:

请注意,使用vmalloc()分配的缓冲区不适用于DMA到/从设备,因为内存页不是连续的。如果你不知道你将预先拥有多少条目,你可能还想考虑一个更复杂的数据结构,比如列表。 对于全局访问存储,您可以像使用任何C程序一样:

在访问数据所需的所有.c文件包含的头文件中,放置如下内容:

extern struct my_struct *unique_name_that_will_not_conflict_with_other_symbols;
extern
关键字表示它声明了在另一个源文件中实现的变量。这将使此指针可访问包含此标头的所有C文件。 然后在C文件中,最好是包含其余代码的文件-如果存在:

struct my_struct *unique_name_that_will_not_conflict_with_other_symbols = NULL;
这是头文件中声明的变量的实际实现

PS:如果你打算使用Linux内核,你真的需要复习一下你的C语言。否则你会遇到一些非常令人沮丧的时刻,最终你会后悔和伤心


PS2:如果你至少浏览一下整个Linux设备驱动程序手册,你也会节省很多时间。尽管它的名字和它的相对年龄,但在为Linux内核编写任何代码时,它都有很多最新和重要的信息。

我不知道你在问什么。。。一个指向包含数组的kmalloc'ed(如果有大量数据,则为vmalloc'ed)缓冲区的指针就足够了。完成后一定要释放它。如果我不清楚,很抱歉。启动系统时首先读取该文件,并且需要在内核中随时访问该数据。基本上,我在用户空间中使用一个助手程序来解析文件。我想将数组的结果复制到内核空间,然后终止用户空间程序。我需要能够随时访问Sockets.c文件中的数据。我不知道该怎么做。我的搜索带来了很多关于模块的信息,但我不确定这是否是“正确”的方法。netlink并不比ioctl更简单或“更安全”,这并不意味着你不应该使用netlink,但是ioctls也没有什么问题。@mpe:这是因为用户空间API更为熟悉,而netlink内核工具处于更高的级别。否则,您可能会像处理内核中的任何其他内容一样处理netlink:-/