繁体   English   中英

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

[英]Storing struct array in kernel space, Linux

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

感谢您的任何建议。

我相信您的问题有两个主要部分:

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

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

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

您的程序应执行所有输入解析和验证,然后将数据传递给内核,最好采用比大量数据Blob更为结构化的形式(例如,逐项输入)。

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

http://en.wikipedia.org/wiki/Netlink

http://www.linuxjournal.com/article/7356

http://linux-net.osdl.org/index.php/Generic_Netlink_HOWTO

http://www.kernel.org/doc/Documentation/connector/

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

http://lwn.net/images/pdf/LDD3/ch08.pdf

请注意,使用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内核编写任何代码时都拥有许多当前和重要的信息。

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

在执行copy_from_user()的代码部分中,使用kmalloc()为数组分配空间,并将地址存储在指针中。 将数据复制到其中。 您还希望将互斥锁锁定在对数组的访问周围。

kmalloc()分配的内存将一直保留,直到用kfree()释放为止。

您的问题是基本而又含糊的,我建议您通过本书中的一些练习来完成。 第8章的整个部分专门介绍内核内存的分配。

将数组初始化为内核模块中的全局变量将使其可永久访问,直到内核运行,即直到您的系统运行为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM