我相信我可能会过度考虑这个问题...我的文件系统上有一个文本文件,我在启动时解析并将结果存储到数组中的结构。我需要将此数组从用户空间复制到内核空间(copy_from_user)中,并且必须随时可以由内核访问此数据。内核空间中的数据将需要由Sockets.c文件访问。有没有特殊的地方可以在内核空间中存储数组,或者我可以简单地在Sockets.c中添加对数组的引用?我的C有点生锈...将结构数组存储在内核空间中,Linux
感谢您的任何建议。
我相信我可能会过度考虑这个问题...我的文件系统上有一个文本文件,我在启动时解析并将结果存储到数组中的结构。我需要将此数组从用户空间复制到内核空间(copy_from_user)中,并且必须随时可以由内核访问此数据。内核空间中的数据将需要由Sockets.c文件访问。有没有特殊的地方可以在内核空间中存储数组,或者我可以简单地在Sockets.c中添加对数组的引用?我的C有点生锈...将结构数组存储在内核空间中,Linux
感谢您的任何建议。
你可以在内核的某个地方定义一个extern
指针(比如,在你要使用它的sockets.c
文件中)。初始化为NULL
,并在一些适当的头文件中包含一个声明。
在执行copy_from_user()
的部分代码中,使用kmalloc()
为阵列分配空间并将地址存储在指针中。将数据复制到它。你还需要一个互斥锁来锁定数组的访问权限。
由kmalloc()
分配的内存将一直存在,直到与kfree()
一起释放。
非常感谢。 :) – CxD 2010-11-23 23:10:33
你的问题是基本的和模糊的,我建议你通过this book中的一些练习。整个第8章专用于分配内核内存。
我相信有您的问题两个主要部分:
从用户空间传送数据到内核空间
在内核空间
存储数据对于第一问题,我会建议使用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内核代码时,它有许多信息是当前和重要的。
我不确定你在问什么......一个包含你的数组的缓冲区的指针指向一个包含你的数组的kmalloc'ed(或者vmalloc'ed)缓冲区就足够了。确保完成后释放它。 – thkala 2010-11-23 22:18:40
对不起,如果我不清楚。在引导系统时最初要读取该文件,并且需要在内核中随时访问该数据。基本上,我在用户空间中使用助手程序来解析文件。我想将数组的结果复制到内核空间,然后终止用户空间程序。我需要能够在Sockets.c文件中随时访问数据。我不确定如何完全做到这一点。我的搜索提出了很多关于模块的信息,但我不确定这是否是“正确”的方式。 – CxD 2010-11-23 22:27:44