我相信我可能会过度思考这个问题了一些…我有一个文本文件位于我的文件系统上,我在启动时parsing并将结果存储到一个结构数组中。 我需要将这个数组从用户空间复制到内核空间(copy_from_user)中,并且必须随时可以由内核访问这些数据。 内核空间中的数据将需要由Sockets.c文件访问。 有没有一个特殊的地方可以在内核空间中存储一个数组,或者我可以简单地在Sockets.c中添加一个对数组的引用? 我的C有点生锈…
感谢您的任何build议。
我相信你的问题有两个主要部分:
将用户空间的数据传递给内核空间
将数据存储在内核空间中
对于第一个问题,我会建议使用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章致力于分配内核内存。