C 在内核空间中存储结构数组,Linux
我相信我可能有点过虑了这个问题。。。我的文件系统中有一个文本文件,我在启动时对其进行解析,并将结果存储到一个结构数组中。我需要将这个数组从用户空间复制到内核空间(从用户复制),并且必须让内核随时可以访问这些数据。内核空间中的数据需要通过Sockets.c文件访问。在内核空间中是否有存储数组的特殊位置,或者我可以简单地在Sockets.c中添加对数组的引用?我的C有点生锈了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
谢谢你的建议。你可以在内核的某个地方定义一个
extern
指针(比如,在你要使用它的sockets.c
文件中)。将其初始化为NULL
,并在某些适当的头文件中包含声明
在执行copy\u from\u user()
的代码部分,使用kmalloc()
为数组分配空间,并将地址存储在指针中。将数据复制到其中。您还希望在访问阵列时锁定互斥锁
由
kmalloc()
分配的内存将一直保留,直到使用kfree()
释放为止。您的问题非常基本且模糊,我建议您完成中的一些练习。第8章的全部内容都致力于分配内核内存。我认为问题有两个主要部分:
- 将数据从用户空间传递到内核空间
- 将数据存储在内核空间中
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:-/