有没有办法从命令行列出运行时加载到内核中的内核模块的完整依赖列表?
让我稍微澄清一下我的问题。
我正在尝试做的事情:
lsmodmodprobe -r. 此步骤失败(显然),因为某些模块正在使用中。(我可以切换到 using rmmod -r,但不想这样做,因为它不安全并且会导致系统崩溃。)失败的是第 2 步,因为在使用modprobe -r.
任何想法、建议或意见?
我将一个外部驱动程序模块添加到Android Gingerbread内核(类似于Linux).我以前做过它并且它有效但这次我遇到了问题.我按照O'Reilly"Linux Device Drivers 3rd edition"中的配方进行操作,即:
在本地Makefile中,添加以下语句:
Run Code Online (Sandbox Code Playgroud)obj-m := GobiNet.o GobiNet-objs := GobiUSBNet.o QMIDevice.o QMI.o
在人类语言中,它意味着从GobiUSBNet.c + QMIDevice.c + QMI.c建立一个GobiNet.ko.
这适用于构建整个内核时调用makefile的情况.我在Ubuntu x86-64bit上交叉编译ARM-EABI系统(Cortex-A8).
不知何故,构建系统理解我想要的东西,因为它在编译期间说:
Run Code Online (Sandbox Code Playgroud)/home/sylvain/Projects/android_gingerbread_realv210_ver_1_0/kernel CHK include/linux/version.h CHK include/generated/utsrelease.h make[1]: `include/generated/mach-types.h' is up to date. CALL scripts/checksyscalls.sh CHK include/generated/compile.h LD drivers/cell/OptionGobiNet/built-in.o CC [M] drivers/cell/OptionGobiNet/GobiUSBNet.o CC [M] drivers/cell/OptionGobiNet/QMIDevice.o CC [M] drivers/cell/OptionGobiNet/QMI.o LD [M] drivers/cell/OptionGobiNet/GobiNet.o Kernel: arch/arm/boot/Image is ready SHIPPED arch/arm/boot/compressed/lib1funcs.S AS arch/arm/boot/compressed/lib1funcs.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready Building modules, stage 2. MODPOST 5 modules ERROR: "usbnet_suspend" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined! ERROR: …
对于我存在的苦难,Makefile,我遇到了一些麻烦.我正在尝试创建一个名为"can.ko"的内核模块(.ko文件).我正在编译十几个源文件:
TARGET = can
OBJS = can_core.o can_open.o can_select.o can_sysctl.o can_write.o can_close.o \
can_ioctl.o can_read.o can_util.o can_debug.o can_error.o can_async.o
KDIR = /lib/modules/3.1.10-1.16-desktop/build
PWD := $(shell pwd)
obj-m += $(TARGET).o
default:
make -C $(KDIR) M=$(PWD) modules
$(TARGET).o : $(OBJS)
Run Code Online (Sandbox Code Playgroud)
编译器吐出它无法找到的内容."can.c".
make[4]: *** No rule to make target `/home/mike/iCOM-SDKv1.11.000/framework/drivers/can/can.c', needed by `/home/mike/iCOM-SDKv1.11.000/framework/drivers/can/can.o'. Stop.
Run Code Online (Sandbox Code Playgroud)
我很确定我不需要在源文件之后命名输出对象,所以显然有些错误.我做了一些关于将多个源文件放在一起并发现这是另一种选择:
TARGET = can
can-objs := can_core.c can_open.c can_select.c can_sysctl.c can_write.c \
can_close.c can_ioctl.c can_read.c can_util.c \
can_debug.c can_error.c \
can_async.c
KDIR = /lib/modules/3.1.10-1.16-desktop/build
PWD := $(shell pwd)
obj-m …Run Code Online (Sandbox Code Playgroud) 我正在为linux内核编写一个模块,它试图窃取数据包及其相关的sk_buff.这样做我想使用struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)&然后在丢弃数据包时将返回类型传递给内核.
所以当内核获取有关数据包丢弃的信息时,它会尝试释放sk_buff.这里我的问题是否会影响我新复制的skb及其数据包的指向数据?或者现在我可以玩我的新sk_buff?
或者是否可以使用skb_clone()并使用分组数据部分而不删除旧sk_buff引用的数据,因为它将降低数据包的复制成本.
我正在写一个内核模块,我需要劫持/包装一些sys调用.我蛮力强制sys_call_table地址,我正在使用cr0来禁用/启用页面保护.到目前为止一切都很好(一旦完成,我会公开整个代码,所以如果有人想要我可以更新这个问题).
无论如何,我注意到如果我劫持__NR_sys_read我在卸载内核模块时会得到内核oops,并且所有konsoles(KDE)都会崩溃.请注意,这不会发生__NR_sys_open或__NR_sys_write.
我想知道为什么会这样.有任何想法吗?
PS:请不要采用KProbes方式,我已经了解它并且我不可能使用它,因为最终产品应该可以使用而无需重新编译整个内核.
编辑 :(添加信息)
我在卸载前恢复原来的功能.另外,我创建了两个测试用例,一个_write只有一个,一个有_read.一个_write卸载很好,但_read卸载然后崩溃的内核).
编辑 :(源代码)
我目前在家,因此我现在无法发布源代码,但如果有人想要,我可以在我上班后立即发布示例代码.(~5小时)
我想将一个大于 1024 个字符的字符串传递给我的模块(文件系统)。由于内核参数限制为 1024 个字符,有人建议改用 sysfs。
我试图在我的 super.c 类中包含这个示例,以便在 sysfs 中为我的模块创建一个字符串 'filename' 和字符串 'code' 条目。
static decl_subsys(myfs, NULL, NULL);
struct myfs_attr {
struct attribute attr;
char *value;
};
static struct myfs_attr fname = {
.attr.name="filename",
.attr.owner = THIS_MODULE,
.attr.mode = 0644,
.value = "/my/test/path",
};
static struct myfs_attr code = {
.attr.name="code",
.attr.owner = THIS_MODULE,
.attr.mode = 0644,
.value = "0101",
};
Run Code Online (Sandbox Code Playgroud)
编译我的模块时出现很多错误(第 41 行是 decl_subsys):
fs/myfs/super.c:41:26: error: expected ‘)’ before ‘(’ token
fs/myfs/super.c:50:2: error: unknown …Run Code Online (Sandbox Code Playgroud) 什么是使用宏象的需要module_init,并module_exit在写加载内核模块?另外,为什么我们使用像__init或等的MACRO __exit.即使我们可以在不使用它们的情况下完成工作.
没有MACROS
/*
Without using MACROS
Author: Sricharan Chiruvolu
Date: 14 Dec 2014
*/
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void){
printk(KERN_ALERT "This is our first program.");
return 0;
}
void cleanup_module(void){
printk(KERN_ALERT "End of our first program.");
}
Run Code Online (Sandbox Code Playgroud)有了MACRO
/*
Edited first.c; Added macros module_init and module_exit
Author: Sricharan Chiruvolu
Date: 14 Dec 2014
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int __init first_init(void)
{
printk(KERN_ALERT "This is our first program."); …Run Code Online (Sandbox Code Playgroud)虽然我们在全局命名空间中定义了这些变量,但为什么我们需要为声明的每个变量显式指定权限.或者我的思维方式完全错了?
int number = 100;
module_param(number, int , 0); // module_param(variable_name, variable_type , permissions);
权限属性中的"0"实际上是什么意思?
我在这里遇到一种情况,我需要针对不同的配置构建相同的内核。现在我试图在不进行 make clean 的情况下构建内核,但这给我带来了问题。有可能一个配置具有一些内置驱动程序,而其他配置可能具有与模块相同的驱动程序。就我而言,我想避免 make clean 以节省时间!编译一个新的内核需要很多时间,因为我之前编译过相同的内核,只更改了几个驱动程序/模块,我想知道除了清理整个内核之外的任何替代选项。
谢谢!
我遵循了一些教程,这些教程解释了如何编写Linux内核模块,我有些困惑。即使阅读了官方的“文档”,我仍然对这些概念缺乏理解。
创建了字符设备(register_chrdev)之后,我发现通常使用以下功能的组合:
class_create
class_device_create
device_create
我无法理解,什么是类,设备以及类设备和驱动程序?
以下哪个真正负责创建条目/proc/?
device-driver kernel-module linux-device-driver linux-kernel
kernel-module ×10
linux-kernel ×6
linux ×5
c ×4
kernel ×4
makefile ×2
macros ×1
sysfs ×1
system-calls ×1