2010-11-23 56 views
0

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

感谢您的任何建议。

+0

我不确定你在问什么......一个包含你的数组的缓冲区的指针指向一个包含你的数组的kmalloc'ed(或者vmalloc'ed)缓冲区就足够了。确保完成后释放它。 – thkala 2010-11-23 22:18:40

+0

对不起,如果我不清楚。在引导系统时最初要读取该文件,并且需要在内核中随时访问该数据。基本上,我在用户空间中使用助手程序来解析文件。我想将数组的结果复制到内核空间,然后终止用户空间程序。我需要能够在Sockets.c文件中随时访问数据。我不确定如何完全做到这一点。我的搜索提出了很多关于模块的信息,但我不确定这是否是“正确”的方式。 – CxD 2010-11-23 22:27:44

回答

1

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

在执行copy_from_user()的部分代码中,使用kmalloc()为阵列分配空间并将地址存储在指针中。将数据复制到它。你还需要一个互斥锁来锁定数组的访问权限。

kmalloc()分配的内存将一直存在,直到与kfree()一起释放。

+0

非常感谢。 :) – CxD 2010-11-23 23:10:33

1

你的问题是基本的和模糊的,我建议你通过this book中的一些练习。整个第8章专用于分配内核内存。

6

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

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

  • 在内核空间

存储数据对于第一问题,我会建议使用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文件中,preferrably一个与你的代码的其余部分 - 如果存在的话:

struct my_struct *unique_name_that_will_not_conflict_with_other_symbols = NULL; 

这是实际执行中头文件中声明的变量。 PS:如果你打算使用Linux内核,你真的需要刷上你的C语言版本,否则你会遇到一些非常令人沮丧的时刻,最终你会感到抱歉和痛苦。

PS2:如果您至少浏览整个Linux设备驱动程序手册,您还可以节省大量时间。尽管它的名字和它的相对年代,在编写任何Linux内核代码时,它有许多信息是当前和重要的。

相关问题