问题标签 [kernel-module]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
8869 浏览

linux-kernel - 如何在 Linux 内核模块中获取电池电量?

我正在尝试获取 Linux 内核模块中的电池电量(该模块是通过 modprobe 插入的)。理想情况下,我想使用内核 API 调用来获取电池信息。我在网上搜索了解决方案,并且我还探索了 Linux 内核源代码和 Michael Meskes 的程序“acpi”的源代码以获取想法。

这些是我认为可以使用的一些技术:

  1. 读取和解析/proc/acpi/battery/BAT0/state/proc/acpi/battery/BAT0/info
  2. 读取/sys/class/power_supply/BAT0/charge_now并且charge_full不涉及解析。
  3. 如果我能弄清楚如何公开接口,我可以尝试使用来自 Linux 内核源驱动程序/acpi/battery.c 的调用。我可能需要这些方法acpi_battery_get_statusacpi_battery_get_info
  4. 我还注意到在驱动程序/acpi/sbs.c 中有一个方法acpi_battery_read,在它的正上方有一条评论说“驱动程序接口”。如果有人知道如何使用它,这可能是另一种方式。

我认为在内核模块中读取文件可能是一个坏主意,但我不确定这些文件如何映射到内核函数调用,所以它可能没问题。

那么,你们能给我一些建议/建议吗?

编辑:我在下面的答案中包含了我的解决方案。

0 投票
2 回答
428 浏览

linux-kernel - modinfo() 等效 INSIDE 内核?

我有两个模块 A、B。A 有一个全局可访问的函数 f(),即导出了 f() 符号。B 可能想偶尔调用 f()。但是如果模块 A 被加载,B 应该只调用 f() 。B 判断 A 是否已加载的最佳方法是什么?

这个问题的 b 部分有没有办法检查 f() 是否被导出?

我不确定哪种方法更有效。

0 投票
1 回答
2334 浏览

c - 编译内核模块时如何解决函数名冲突

我正在尝试为 RHEL 5.6 编译第 3 方内核模块,但由于函数名称与 和 冲突而mutex_acquire失败mutex_release。这个内核模块在 RHEL 4.7 上编译干净,所以内核 2.6.9 和 2.6.18 之间发生了一些变化。遗憾的是,供应商不再支持这个内核模块,但我确实有源代码mutex.cmutex.h定义了这些函数。不幸的是,有一个nivxi.o没有分发源代码的目标文件,并且该目标文件正在调用mutex_acquiremutex_release所以我不能简单地更改它们的名称。

顺便说一句,我最初试图只是稍微修改名称,编译错误就消失了,但是当它去制作 .ko 内核模块时,它抱怨它找不到mutex_acquireor mutex_release; 大概是由于nivxi.o

如何强制编译器/链接器使用本地 .c/.h 文件中的函数定义,即使它们在其他地方击败了同名函数?

互斥体.h

nivxicc.h(以防万一这是相关的)

/usr/include/lockdep.h(冲突定义)

错误

0 投票
2 回答
545 浏览

linux-kernel - Syscall实现内核模块2.6

在做了一些阅读之后,我了解到通过 LKM 添加新的系统调用在 2.6 中变得更加困难。似乎系统调用表不再导出,因此(不可能?)在运行时插入新调用。

我想要实现的东西如下。

我有一个正在执行特定任务的内核模块。此任务取决于应由用户登陆进程提供的输入。此信息需要到达模块。为此,我将介绍一个新的系统调用,它在内核模块中实现并且可以从用户态进程调用。

如果我必须重新编译内核才能添加新的系统调用,我还需要在内核模块之外编写实际的系统调用逻辑,对吗?

还有另一种方法可以做到这一点吗?

干杯,eeknay

0 投票
5 回答
43352 浏览

c - 如何在linux内核空间中获取当前时间(一天中的时间)

我正在编写一个内核模块来检查时间是否在两个指定的小时之间,如果是则禁用输入。这与我想确保我早点睡觉有关。(我知道我也可以使用任意数量的不同技术,包括 cron 等,但我想学习内核编程......)

因此,作为第一个版本,我检查当前时间是否在开始和结束之间,这是通过模块的参数设置的。

因此,我的问题是:如何获得当前时间?我无法访问标准库中的常用时间函数,因为我在内核空间中。我猜我应该为此使用 do_gettimeofday() ,但这只会给我几秒钟和纳秒的时间,而且我当天需要几个小时。

谢谢。

0 投票
2 回答
1245 浏览

c - 重建/更新内核模块

嘿,下面的问题:我在工作中使用了一个相当奇怪的 linux 发行版(Centos 5),它似乎有一个较旧的内核(或至少内核中有一些差异),你不能简单地更新它。我需要安装的程序需要一个函数crypto_destro_tfm(还有更多问题,但这是目前唯一的错误),它包含在文件linux/crypto/api.c中 - 所以我假设它在内核模块crypto_api中。问题是:在我的发行版上,我什至没有crypto/api.c,即使我有一个模块crypto_api.ko,似乎这个函数也不在那里。

我的计划如下:从较新的 linux 发行版中获取 crypto_api,然后对其进行编译并将模块加载到我的 centos 中。

现在我希望你们中的一些人能告诉我我需要做什么来重建和替换那个模块。当然,我确实拥有来自较新内核的所有源文件。(只是提醒你:我不能简单地重新编译和使用更新的内核,b/c centos 就这样糟透了)谢谢

FWIW:这是确切的错误

警告:“crypto_destroy_tfm”[/home/Chris/digsig-patched/digsig_verif.ko] 未定义!

0 投票
2 回答
1579 浏览

c - 如何禁止从 linux 内核模块访问键盘和鼠标?

我正在尝试编写一个内核模块,它在一天中的某些时间禁用输入。我发现了如何获取时间(如何在 linux 内核空间中获取当前时间(一天中的时间))以及如何安排函数。我似乎无法弄清楚如何禁用输入。我认为内核必须在某个地方执行此操作,但是在阅读了 API 之后,我仍然没有进一步前进。我想我应该直接访问驱动程序并将它们关闭或其他东西,但这似乎有点不通用。这甚至可能吗?

谢谢你的时间。

0 投票
1 回答
528 浏览

linux - Linux内核:什么是指令缓存和mp-IRQ子系统,通过replace进行函数拦截?

我正在尝试实现一个内核函数拦截(使用这个旧方法(c) Silvio 替换 System.map 的函数指针);根据这个论坛帖子,一些可能的缺陷可能与指令缓存和 mp-IRQ 源有关,它们在拦截后没有刷新/更新。

这些子系统是什么以及在这种情况下如何处理它们?

0 投票
0 回答
507 浏览

android - Archos 5 IT 的 Cisco VPN 客户端安装问题

我有一个带有 Android 1.6 的 Archos 5 IT 固件 v2.0.38,但我没有找到任何如何安装 vpnc 的站点。主要问题是我不知道如何编译/交叉编译 tun.ko 模块和 vpnc 包。我确实在设备上具有 root 访问权限。

0 投票
3 回答
41205 浏览

c - 如何在 rmmod 上停止 Linux 内核线程?

我编写了以下代码来创建内核线程:

在给出 insmod 命令时,我可以创建一个名为“pradeep”的内核线程,并且可以使用以下 ps -ef命令查看新线程

它的父级是 PID 为 2 的 kthreadd。但我无法在发出rmmod命令时停止该线程。它给出以下输出:

有人可以告诉我如何杀死这个线程吗?