gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:41 24 4
gpt4 key购买 nike

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

感谢您的任何建议。

最佳答案

我认为你的问题有两个主要部分:

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

  • 将数据存储在内核空间

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

您的程序应该执行所有输入解析和验证,然后将数据传递给内核,最好以比海量数据 blob 更结构化的形式(例如逐个条目)传递。

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

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 Device Drivers 一书的相关章节:

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 关键字表示这声明了一个在另一个源文件中实现的变量。这将使所有包含此 header 的 C 文件都可以访问此指针。然后在 C 文件中,最好是包含其余代码的文件 - 如果存在的话:

struct my_struct *unique_name_that_will_not_conflict_with_other_symbols = NULL;

这是头文件中声明的变量的实际实现。

PS:如果你打算使用 Linux 内核,你真的需要重温你的 C。否则你会遇到一些非常令人沮丧的时刻,你最终会感到遗憾和痛苦。

PS2:如果您至少浏览一下整本 Linux 设备驱动程序书,您也会节省很多时间。尽管它的名字和它的相对年龄,它有很多信息,在为 Linux 内核编写任何代码时都是最新的和重要的。

关于c - 在内核空间中存储结构数组,Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com