kernel-module相关内容
我想编译我的C代码(在内核中),该代码需要包含另一个目录中的一些头文件. 我不想在c文件中指定头文件的完整路径,而是在Makefile中指定包含路径. 启用配置选项CONFIG_FEATURE_X后,将编译我的c文件. 我已经在Makefile中写了以下内容: obj-$(CONFIG_FEATURE_X) += my_file.o ccflags-$(CONFIG_FEATU
..
使用此答案中的配置,可以从/etc/nixos/configuration.nix中的nixos-unstable安装软件包.. > 这是从nixos-unstable安装htop软件包的示例: { config, pkgs, ... }: let unstableTarball = fetchTarball https://github.com/NixOS/n
..
我想访问内核内部的性能计数器.我找到了许多在用户空间中使用性能计数器的方法,但是您能告诉我在内核空间中使用性能计数器的一些方法吗? 请不要指定工具名称,我想编写自己的代码,最好是内核模块.我在内核3.18.1中使用Ubuntu. 解决方案 http ://www.cise.ufl.edu/~sb3/files/pmc.pdf http://www.cs.inf.ethz.ch /st
..
我正在使用perf用户界面工具进行基于事件的采样:目标是试图找出某些性能影响事件(例如分支未命中和缓存未命中)在我正在使用的较大系统上发生了什么地方. 现在,类似 perf record -a -e branch-misses:pp -- sleep 5 完美运行:当在样本中收集IP时,由'pp'修饰符触发的PEBS计数模式确实非常准确. 不幸的是,当我尝试对缓存缺失执行相同
..
运行perf时,它会找到内核符号和程序的符号,但找不到外部模块符号.我已经编写了一个内核模块,该内核模块使用insmod加载,如何告诉perf也找到其符号? 我正在运行2.6.37.6内核(无法升级),我的perf尚不支持dwarf选项,但我认为它是符号问题.我已经用-g -fno-omit-frame-pointer 编译了所有内容 解决方案 我必须使其成为内核模块,然后perf才能
..
我想在/proc/driver目录下创建一个文件.我想使用像proc_root_driver这样的宏(或其他提供的东西),而不是显式地使用"driver/MODULE_NAME".我使用create_proc_entry: struct proc_dir_entry *simpleproc_fops_entry; simpleproc_fops_entry = create_proc_ent
..
我想在内核模块中使用功能getname.它不会导出.由于我现在遇到了这个问题,所以我想知道如何访问和使用任何未导出的内核符号.我认为使用一个符号所必需的步骤会有所不同,具体取决于符号是什么,因此我想了解如何对类型(例如,结构),变量,指针表(例如系统)完成操作调用表)和一个函数.在以下两种情况下如何完成这些操作: 当我从System.map或/proc/kallsyms知道符号的地址时.
..
我正在使用Linux 2.6.26内核版本,并且尝试使用内核模块更改中断描述符表.我只是想在这里更改页面错误表条目.因此,我制作了原始IDT的副本,并仅对页面错误表条目进行了更改. ISR的目的是在调用原始的页面错误处理程序之前打印出页面错误的信息.但是,一旦我使用insmod加载内核,内核便崩溃了,即,它专门通过"loadIDTR"函数崩溃了.经过进一步的调试,我发现如果不加载IDTR便不更改任
..
我有一个简单的内核对象,用于在内核内存中进行探测. 如果我在64位Ubuntu(3.2)计算机上构建它,则在该计算机上可以正常工作.但这在我的64位Ubuntu(3.9)计算机上不会显示insmod.反之亦然.如果我尝试在非内核版本上运行它,则出现"-1无效的模块格式"错误. 我认为insmod将其动态链接到导出的符号表,并且导出的符号表在内核版本之间不会更改. (它被附加.)
..
我正在编写一个创建IP数据包的内核模块.现在,我想发送此数据包,但尚未为其传输创建任何套接字. 有什么方法可以借助内核例程直接发送它. 由于我已经跟踪了Linux内核代码以进行数据包传输,因此在 net/core/dev.c 中定义了一个名为 dev_hard_start_xmit()的函数.我们可以使用它吗? 实际上我不想使用套接字. 解决方案 您不需要套接字就可以在内
..
我需要帮助来理解为什么插入模块时会出现错误.我已经尝试过这没有成功. $ sudo modprobe lpfc_scst FATAL: Error inserting lpfc_scst (/lib/modules/2.6.32-33-generic/extra/lpfc_scst.ko): Unknown symbol in module, or unknown parameter (s
..
当我尝试对模块进行rmmod操作时,出现错误消息“错误:模块正在使用",lsmod | grep 显示计数. 有没有办法告诉我哪些进程正在使用此特定的内核模块/驱动程序? 解决方案 最好的建议是dmesg并查找有关模块加载内容的任何指示. 如果您的内核是受支持的,则还可以尝试将--force参数用于rmmod.
..
出于测试目的,我使用yocto提供的示例配方来演示如何构建内核模块. SUMMARY = "Example of how to build an external Linux kernel module" LICENSE = "GPLv2" LIC_FILES_CHKSUM = "file://COPYING;md5=12f884d2ae1ff87c09e5b7ccc2c4ca7e" in
..
我有两个内核模块(例如modA和modB). modA使用EXPORT_SYMBOL(symA)导出符号,而modB使用它.我有modA的标题modA.h: ... extern void symA(int param); ... 和modB.c中的 #include "modA.h" ... static int __init modB_init(void) { symA
..
我需要用自己的实现替换标准的系统调用(例如SYS_mkdir). 正如我在某些资料中所读到的,包括这个问题在Stackoverflow上,从内核版本2.6开始,不会导出sys_call_table符号. 我尝试了以下代码: #include #include #include
..
我正在Ubuntu中工作.我正在尝试制作两个使用彼此功能的内核模块.我的问题是我已经正确编译了模块,但是其中之一无法解析该符号. 为简单起见,我们将这些模块称为m1和m2. m2是导出功能void func_m2(void). m1正在调用此函数.这两个模块都可以正确编译. 全部编译之后,我需要先加载m2模块(因为它已经导出了func_m2函数),然后再加载m1模块.所以,让我们
..
在驱动程序module_init和内核的其他函数中,内核中有许多__init调用的实例.我的疑问是内核如何精确地确定__init调用的顺序.更重要的是,它如何确定驱动程序module_init调用的顺序? 解决方案 所有初始化魔术都在文件中实现: include/asm-generic/vmlinux.lds. h include/linux/init.h init/main.c
..
我一直在浏览net/core/dev.c和其他文件,以试图找到如何获取当前已配置的网络设备的列表,事实证明这很难找到. 最终目标是能够使用dev.c中的dev_get_stats获取网络设备统计信息,但是我需要了解当前接口,以便可以抓取net_device结构以进行传递.我必须在内核,因为我正在编写一个模块,该模块添加了一个新的/proc/条目,该条目与当前网络设备的某些统计信息相关,因此,
..
通常,内核源存储在/usr/src/linux-2.6.x/中. 为了避免在修改模块的源代码时重新编译整个内核,该如何仅重新编译该模块? 解决方案 切换到源代码树的根目录,然后运行以下命令: $ make modules SUBDIRS=drivers/the_module_directory 并安装已编译的模块: $ make modules_install SUBDIR
..
我有两个模块A,B.A具有全局可用的函数f(),即,导出了f()符号. B可能希望偶尔调用f().但是,只有在加载了模块A的情况下,B才应调用f(). B判断A是否已加载的最佳方法是什么? 此问题的b部分是否有一种方法可以检查是否导出了f()? 我不确定哪种方法更有效. 我假设您先加载模块B,然后加载模块A.我的策略是在A首次初始化时让A向B注册一组函数. B保持静态分配的函数指针(
..