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

2024-02-11

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

感谢您的任何建议。


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

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

  • 将数据存储在内核空间中

对于第一个问题,我建议使用 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 内核编写任何代码时既最新又重要的信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在内核空间中存储结构体数组,Linux 的相关文章

随机推荐

  • Python 中的简单原始数据包嗅探器

    首先 我是Python的初学者 我开发了一个简单的原始数据包嗅探器 利用PF PACKET运行在第 2 层的接口 嗅探器简单地计算出以下内容 以太网标头 源 目标 协议 IP 标头 源 IP 目标 IP TCP 标头 源端口 目标端口 这是
  • Bash 脚本在所有文件前面添加一个随机数

    我有一部 智能 手机 似乎没有音乐随机播放功能 因此最好的办法是编写一个 bash 脚本 在当前目录中的所有文件名前面添加一个随机数 这很难做到吗 不 这并不难做到 然而 它会弄乱您精心设计的文件名 并且可能很难撤消 您可以使用 RANDO
  • 如何确定互补滤波器的参数alpha?

    我知道互补滤波器兼有LPF和HPF的功能 但我认为我对其背后原理的理解仍然不清楚 我对数字信号处理很陌生 也许一些非常基本的解释会有很大帮助 假设我有一个互补过滤器 如下所示 y a y 1 a x 然后我的参数a可以通过以下方式计算 a
  • 如何检查设备是否是Ipad mini [重复]

    这个问题在这里已经有答案了 可能的重复 处理 iPad Mini 屏幕尺寸 https stackoverflow com questions 13036745 dealing with ipad mini screen size 是否可以
  • 如何确定 matplotlib 正在使用哪个后端?

    无论是交互方式 例如从 Ipython 会话中 还是从脚本中 如何确定 matplotlib 正在使用哪个后端 Use the get backend https matplotlib org stable api matplotlib c
  • 当输入元素的宽度被指定时,如何强制自由 CSS 调整大小?

    我有一个简单的问题 文本输入元素指定了 2 个 CSS 属性 请参阅下面的代码
  • 如何在运行时设置 MVC 中选择列表的默认值

    我有一个视图 它循环遍历模型并以可编辑模式显示详细信息 模型值之一来自如下选择列表 if Model null for int i 0 i lt Model provider service dtls Count i tr td Html
  • 如何编写 Objective-C 完成块

    我遇到的情况是需要从视图控制器调用类方法 让它做它的事情 但只有在类方法完成后才执行一些操作 我认为我需要的是一个完成块 但如果我错了 请纠正我 情况如下 我使用 Parse com 作为我的应用程序后端 当用户注册帐户时 他们在弹出窗口中
  • 如何解决Python中的错误“模块'numpy'没有属性'float'”?

    我正在使用 NumPy 1 24 0 运行此示例代码行时 import numpy as np num np float 3 我收到此错误 Traceback most recent call last File
  • 有选择地为 CakePHP 中的某些操作启用 SSL

    我正在尝试仅对基于 CakePHP 的网站上的某些操作启用 SSL 我正在使用 requireSecure 执行此操作并重定向到https 网址 https url在相应的blackHoleCallback 中 为了降低服务器负载 我想重定
  • 将会话变量或自定义字段添加到 Elmah 错误日志表

    我想将我自己的会话变量添加到 elmah 错误日志表并显示它 我已经修改了源代码并将新字段添加到 Error cs 和其他字段中 但我不知道 但是当我将 HttpContext Current Session MyVar tostring
  • 由于 MIME 类型(“text/html”)不匹配(X-Content-Type-Options:> nosniff),资源被阻止

    文件结构 索引 js app set view engine ejs app use express static public app use bodyParser urlencoded extended true chat ejs h1
  • Java - 一种采用 vararg 并返回 arraylist 的方法?

    我对泛型并不完全满意 因此还没有找到解决方案 我有这三种方法 public static List
  • 如何在R中根据中心和半径绘制三维球体?

    如何通过提供中心点和半径在 R 中绘制球体 例如 这样的事情 sphere 3d center c 1 1 1 r 2 该图将出现在三维坐标系上 Try spheres3d in the rgl交互式绘图包 library rgl sphe
  • Invoke() 被阻塞

    我的应用程序 GUI 有时会停止重绘 有很多线程正在触发各种事件 例如计时器或网络数据就绪等 还有很多控件正在订阅这些事件 因此 所有事件处理程序都会玩 InvokeRequired Invoke 游戏 现在我发现当 GUI 冻结时 很多线
  • 如何修改 Visual Studio 2015 预定义宏?

    我正在尝试修改 Visual Studio 2015 中的预定义环境宏 具体来说 VC 包含路径 我可以看到它及其值 但无法修改它 我没有看到执行此操作的选项 您可以编辑此文件 C 程序文件 x86 MSBuild Microsoft Cp
  • 数组的地址与第一个元素的地址不同?

    据我所知数组的地址a是该数组的第一个元素的地址 void func int a cout lt lt address in func lt lt a lt lt endl cout lt lt GT lt lt a 0 lt lt endl
  • Rails:rspec 中 url 帮助程序的主机名错误

    Url 帮助程序 例如 root url 在应用程序控制器与 rspec 示例中返回不同的主机名 我已经成功地在我的 Rails 应用程序中设置了 url 助手的域 如下所示 class ApplicationController lt A
  • 导入 Windows Live 联系人

    我已经开始从实时导入联系人 现在我不知道微软在想什么 但他们真的把他们所做的一切都搞得太复杂了 对于我的应用程序来说 获取电话号码非常重要 事实上 非常重要的是 如果您没有电话号码 您的联系方式将被跳过 用我的方法我看不到任何电话号码 我以
  • 在内核空间中存储结构体数组,Linux

    我相信我可能有点过度思考这个问题 我的文件系统上有一个文本文件 我在启动时解析该文件并将结果存储到结构数组中 我需要将此数组从用户空间复制到内核空间 copy from user 并且必须让内核随时可以访问此数据 内核空间中的数据需要通过