我相信您的问题有两个主要部分:
将数据从用户空间传递到内核空间
将数据存储在内核空间中
对于第一个问题,我建议使用 Netlink 套接字,而不是更传统的系统调用(读/写/ioctl)接口。 Netlink 套接字允许使用类似套接字的接口将配置数据传递到内核,这使用起来更加简单和安全。
您的程序应该执行所有输入解析和验证,然后将数据传递到内核,最好以比大量数据 blob 更结构化的形式(例如逐项)。
除非您对高吞吐量(每秒兆字节数据)感兴趣,否则 netlink 接口就很好。以下链接提供了说明以及示例:
http://en.wikipedia.org/wiki/Netlink http://en.wikipedia.org/wiki/Netlink
http://www.linuxjournal.com/article/7356 http://www.linuxjournal.com/article/7356
http://linux-net.osdl.org/index.php/Generic_Netlink_HOWTO http://linux-net.osdl.org/index.php/Generic_Netlink_HOWTO
http://www.kernel.org/doc/Documentation/connector/ http://www.kernel.org/doc/Documentation/connector/
就数组存储而言,如果您计划存储超过 128KB 的数据,则必须使用 vmalloc() 来分配空间,否则首选 kmalloc()。您应该阅读《Linux 设备驱动程序》一书的相关章节:
http://lwn.net/images/pdf/LDD3/ch08.pdf 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;
The extern
关键字表明这声明了一个在另一个源文件中实现的变量。这将使包含该标头的所有 C 文件都可以访问该指针。
然后在一个 C 文件中,最好是包含其余代码的文件 - 如果存在:
struct my_struct *unique_name_that_will_not_conflict_with_other_symbols = NULL;
这是头文件中声明的变量的实际实现。
PS:如果你要使用 Linux 内核,你真的需要温习你的 C 语言。否则你将会经历一些非常令人沮丧的时刻,并且最终会感到抱歉和痛苦。
PS2:如果您至少浏览整本 Linux 设备驱动程序书籍,您还将节省大量时间。尽管它的名字和它的相对年龄,它包含了许多在为 Linux 内核编写任何代码时既最新又重要的信息。