作为我项目的一部分,我需要读取内核以获取系统调用表和系统调用地址的内存地址.或者实际上我需要提取系统调用表的内容和所有系统调用.
直到现在我才将GDB用于此目的.有没有办法让我可以使用内核模块.我是新的内核模块编程.在这里寻求专家的建议.
我有一些使用名为foo.ko. 这必须insmod来自Linux内核。
有没有办法在 insmod 期间将参数传递给内核模块,例如:
insmod foo.ko <parameter>
Run Code Online (Sandbox Code Playgroud)
?
我需要访问 Android 内核模块中的一些 proc 文件。基本上我需要 cat 命令中显示的信息,例如cat /proc/uptime. 但是我需要以编程方式进行。
我尝试使用proc_fs函数,但对我来说有点模糊,通常示例是创建一个 proc 文件然后读取它,就是这样。我需要实际使用 proc 文件中的数据。
我也尝试过fopen,但它似乎不适用于模块。
我怎样才能做到这一点?我真的是新手。我正在研究金鱼 Android 内核。
谢谢。
更多的是概述问题而不是技术问题。我可以看到周围的 Linux 内核开发人员职位,我想知道您希望成为什么内核模块?与使用系统调用和执行其他操作相比,哪些类型的任务最适合作为内核模块完成?
less /proc/modules在我的系统上显示 dm_log,设备映射器的记录器。为什么日志记录是从内核完成的,而不是在用户空间完成的?
我制作了一个简单的模块,可以在加载时打印 GDT 和 IDT。当它完成工作后,就不再需要它并且可以卸载。但如果它返回负数以停止加载,insmod则会抱怨,并且错误消息将记录在内核日志中。
内核模块如何优雅地卸载自身?
我想在内核 (3.x) 模块中使用参数:
static char param = 0xff;
module_param(param, ushort, S_IRUGO | S_IWUGO);
MODULE_PARM_DESC(param, "a parameter");
Run Code Online (Sandbox Code Playgroud)
有没有可能检测到这个参数的变化?是否有可用于调用服务例程的信号?
最好的问候亚历克斯
附加信息module_param(name,type,perm):
的可能值type:
boolinvboolcharpintlongshortuintulongushortperm在linux/stat.h 中定义
#define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO)
#define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
#define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH)
#define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH)
#define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH)
Run Code Online (Sandbox Code Playgroud)
这是一个完整的代码示例:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Alex");
MODULE_DESCRIPTION("test module.");
MODULE_VERSION("0.1");
static int param = 1;
module_param(param, int, S_IRUGO|S_IWUGO);
static int __init mod_init(void){
printk(KERN_INFO "param %d\n", …Run Code Online (Sandbox Code Playgroud) 出于测试目的,我使用yocto提供的示例配方来演示如何构建内核模块.
SUMMARY = "Example of how to build an external Linux kernel module"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=12f884d2ae1ff87c09e5b7ccc2c4ca7e"
inherit module
PR = "r0"
PV = "0.1"
SRC_URI = "file://Makefile \
file://hello.c \
file://COPYING \
"
S = "${WORKDIR}"
# The inherit of module.bbclass will automatically name module packages with
# "kernel-module-" prefix as required by the oe-core build environment.
Run Code Online (Sandbox Code Playgroud)
该hello.c文件非常简单.
#include <linux/module.h>
int init_module(void)
{
printk("Hello World!\n");
return 0;
}
void cleanup_module(void)
{
printk("Goodbye Cruel World!\n");
} …Run Code Online (Sandbox Code Playgroud) 我试图找出内核模块是如何自动插入的。我正在使用 Arch Linux,所以基本上我正在使用systemd.
经过一番研究,我知道至少有两种方法可以插入内核模块:
systemd有一个名为 的单元systemd-modules-load.service,它读取/etc/modules-load.d/*.conf(以及 和 中的/run内核模块名称/usr/lib)(systemd 文档)。
udev当检测到设备时可以自动处理内核模块(Arch Linux wiki 页面)。
但是,我没能看到它们是如何工作的:
/etc/modules-load.d/*.conf我的系统上(或 或/run)中没有配置文件/usr/lib。因此它没有什么可加载的systemd-modules-load.service。
中有一些modprobe命令/usr/lib/udev/rules.d,但不是我在 中看到的所有内核模块lsmod。
例如,我xfs在 的输出中有一个内核模块lsmod,但我找不到插入它的触发点。我的文件系统都没有安装xfs(cat /proc/mounts | grep xfs什么也不显示)。
有没有关于这一切如何运作的介绍或教程?
我想以非交互式方式运行“make localmodconfig”。在尝试的同时
是的 " " | 进行本地修改配置
给出了以下错误:
Console input/output is redirected. Run 'make oldconfig' to update configuration.
make[1]: *** [scripts/kconfig/Makefile:45: localmodconfig] Error 1
make: *** [Makefile:547: localmodconfig] Error 2
Run Code Online (Sandbox Code Playgroud)
我更喜欢 localmodconfig 而不是 olddefconfig 因为旧内核有 3000 多个模块并且只使用其中的 30 个。关于如何实现这一目标的任何想法?
我目前正在尝试开发一个简单的Linux内核模块。它应该只记录一些东西,它是从互联网上一比一复制的。
我有以下文件:lkm_example.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Robert W. Oliver II");
MODULE_DESCRIPTION("A simple example Linux module.");
MODULE_VERSION("0.01");
static int __init lkm_example_init(void) {
printk(KERN_INFO "Hello, World!\n");
return 0;
}
static void __exit lkm_example_exit(void) {
printk(KERN_INFO "Goodbye, World!\n");
}
module_init(lkm_example_init);
module_exit(lkm_example_exit);
Run Code Online (Sandbox Code Playgroud)
生成文件:
obj-m += lkm_example.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean
Run Code Online (Sandbox Code Playgroud)
我还做了以下工作:
sudo apt-get install build-essential linux-headers-`uname -r`
Run Code Online (Sandbox Code Playgroud)
对于编译我使用:
stbau@kernel-dev-vm:~/src/lkm_example$ sudo make
make -C /lib/modules/5.13.0-39-generic/build M=/home/stbau/src/lkm_example modules
make[1]: …Run Code Online (Sandbox Code Playgroud)