标签: kernel-module

是否可以通过LKM添加系统调用?

我想通过LKM添加一个新的系统调用,但我不知道如何做到这一点.也就是说,我知道如果我想添加一个全新的系统调用,我可以查看sys_call_table并查找sys_ni_syscall并替换它,但我很好奇是否可以实际添加sys_call_table.我意识到这可能不是可能的,因为它是一个固定大小的数组,但我想知道是否有任何其他聪明的方式来添加系统,而无需重写未使用的系统调用号调用.

linux kernel-module

9
推荐指数
1
解决办法
2739
查看次数

Linux内核模块 - 创建proc文件 - proc_root未声明的错误

我复制并粘贴此URL中的代码,用于使用内核模块创建和读取/写入proc文件,并获取proc_root未声明的错误.同样的例子是在几个网站上,所以我认为它的工作原理.有什么想法我会收到这个错误吗?我的makefile需要不同的东西吗?下面是我的makefile:

基本proc文件创建的示例代码(直接复制和粘贴以完成初始测试):http: //tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN769

我正在使用的Makefile:

obj-m    := counter.o

KDIR    := /MY/LINUX/SRC

PWD    := $(shell pwd)

default:
 $(MAKE) ARCH=um -C $(KDIR) SUBDIRS=$(PWD) modules
Run Code Online (Sandbox Code Playgroud)

kernel kernel-module linux-kernel

9
推荐指数
2
解决办法
1万
查看次数

Linux内核 - 获取最后写入的内存块

在linux内核中,是否有任何数据结构自动始终保存分区的最后写入块编号?我找不到任何可用于获取此信息的内置内核源代码.任何帮助表示赞赏.

kernel kernel-module linux-kernel

9
推荐指数
1
解决办法
258
查看次数

如何确定Linux内核模块是否泄漏内存

为了测试内核泄漏内存时的行为,我正在编写一个内核模块,它不断分配内存,例如代码

int bytesLeaked = 128000;
char *var = kmalloc(bytesLeaked, GFP_KERNEL); 
if (var != NULL)
printk("leaked %d bytes at address %x\n", bytesLeaked, (unsigned int)var);
Run Code Online (Sandbox Code Playgroud)

此代码位于init_module中.我有以下问题

  1. 如何确定代码是否泄漏了内存?lsmod并没有透露太多.
  2. 互联网上的教程仅显示init_module和exit_module中的代码.如果我希望在插入模块之后但在退出之前的一段时间内进行内存分配,该怎么办?
  3. 我是否有可能只在用户给出指令时才编写泄漏内存的代码,例如用户空间程序是否可以进行系统调用,这会导致模块泄漏内存?

memory-management kernel-module linux-kernel

9
推荐指数
2
解决办法
1万
查看次数

为什么我的模块无法处理内核分页请求?

这是我使用dequeue_huge_page_vma()和alloc_buddy_huge_page()分配一个大页面的模块.为了使它们与vma无关,我从__get_vm_area_node()获得可用的vm区域,然后获取其虚拟地址.我想分配一个2MB的页面,但内核说:

[   84.944634] BUG: unable to handle kernel paging request at ffffc90013d02000
[   84.944641] IP: [<ffffffffa0ac9063>] vma_null_test+0x63/0xa3 [vma_null_test]
[   84.944650] PGD bd019067 PUD bd01a067 PMD b35c0067 PTE 0
[   84.944657] Oops: 0000 [#1] SMP 
Run Code Online (Sandbox Code Playgroud)

我的代码:

/*
 * vma_null_test.c - Cindy: to test if vma can be set to NULL in alloc_huge_page() 
 */

 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/hugetlb.h>
 #include <linux/mm.h>
 #include <linux/list.h>
 #include <asm/page.h>
 #include <linux/nodemask.h>
 #include <linux/gfp.h>
 #include <linux/mm_types.h>
 #include <asm-generic/pgtable.h>
 #include <linux/err.h>
 #include <linux/vmalloc.h>
 #define TWO_MB …
Run Code Online (Sandbox Code Playgroud)

memory-management kernel-module virtual-memory linux-kernel

9
推荐指数
1
解决办法
1621
查看次数

最佳实践:在哪里重新采样PCM和哪种工具?

我开发了一个内核模块(Android),它为我提供:

PCM
16-bit
48000 Hz
2 channel
Run Code Online (Sandbox Code Playgroud)

我想把它流式传输到Java的Apple机场快线(AEX).

AEX需要44.1 kHz PCM,因此我必须重新采样PCM流.

我有以下可能性,但哪个最好?

1.使用C程序"raop_play"(raop-play的一部分)

advantages: 
            high-performant due to native C
            already uses libsamplerate to resample wav, mp3, ogg, flac, aac, pls
            openssl as static library
            usable via command-line from my java-program via Runtime.exec()

disadvantages:
            I am relative new to C
            overloaded: I don't need wav, mp3.. only PCM
            many dependencies with GPL-libraries which I have to compile for Android
            only supports PCM already with 44.1 kHz, no resampling for …
Run Code Online (Sandbox Code Playgroud)

c java java-native-interface kernel-module resampling

9
推荐指数
1
解决办法
1753
查看次数

内核模块Init和Exit函数的调用顺序错误

我正在创建一个非常简单的hello world内核模块并获得一些疯狂的行为.这一直有效,直到我升级到内核3.3.8,现在它......好吧,它init在退出时调用函数,并exit在初始化时调用函数.我确保我的名字是正确的

// Needed for module definitions
#include <linux/module.h>
// Needed for initilization modules
#include <linux/init.h>

// Must declare some license
MODULE_LICENSE("Dual BSD/GPL");

// Function to be called on insmod
// Returns 0 on success
static int __init mymod_init(void)
{
        // Prints kernel alert.  Check /var/log/syslog
        printk(KERN_ALERT "Module was loaded, this is the printk.");

        return 0;
}

// Function to be called on rmmod
static void __exit mymod_exit(void)
{
        // Prints kernel alert.  Check /var/log/syslog
        printk(KERN_ALERT …
Run Code Online (Sandbox Code Playgroud)

c linux kernel module kernel-module

9
推荐指数
1
解决办法
5412
查看次数

以编程方式检查运行时是否存在Linux内核模块

我正在编写一个C守护进程,它依赖于两个内核模块的存在才能完成它的工作.该程序不直接使用这些(或任何其他)模块.它只需要它们存在.因此,我想以编程方式检查这些模块是否已加载,以便在运行时警告用户.

在我开始做解析/proc/moduleslsmod输出之类的事情之前,某个实用程序函数是否已经存在?喜欢的东西is_module_loaded(const char* name);

我很确定以前曾经问过这个问题.但是,我想我错过了正确的搜索条件.

c system-calls kernel-module

9
推荐指数
2
解决办法
4816
查看次数

linux-kernel模块中的系统调用拦截(内核3.5)

我需要用自己的实现替换标准系统调用(例如SYS_mkdir).

正如我在一些来源中读到的,包括Stackoverflow上的这个问题,sys_call_table自内核版本以来,它不是导出的符号2.6.

我尝试了以下代码:

    #include <linux/module.h> 
    #include <linux/kernel.h> 
    #include <linux/unistd.h> 
    #include <asm/syscall.h> 

    int (*orig_mkdir)(const char *path); 

    ....

    int init_module(void) 
    { 
            orig_mkdir=sys_call_table[__NR_mkdir]; 
            sys_call_table[__NR_mkdir]=own_mkdir;  
            printk("sys_mkdir replaced\n"); 
            return(0); 
    } 

    ....
Run Code Online (Sandbox Code Playgroud)

不幸的是我收到编译错误:

 error: assignment of read-only location ‘sys_call_table[83]’
Run Code Online (Sandbox Code Playgroud)

如何更换系统调用?

编辑:有没有内核修补的解决方案?

c module kernel-module linux-kernel

9
推荐指数
3
解决办法
1万
查看次数

Linux内核模块崩溃调试:一般保护错误:0000 [#1] SMP

我有一个内核模块,用于分割传入的rtp数据包和合并rtp传出数据包.程序在2/3天内崩溃一次.如果可以找到模块崩溃的确切行,对我来说会非常方便.我在下面给出了崩溃转储.是否可以从崩溃转储中找到代码中的确切行?

    PID: 1256   TASK: ffff88020fc71700  CPU: 0   COMMAND: "rtpproxy"
 #0 [ffff880212faf2f0] machine_kexec at ffffffff8103bb7a
 #1 [ffff880212faf360] crash_kexec at ffffffff810bb968
 #2 [ffff880212faf430] oops_end at ffffffff8169fad8
 #3 [ffff880212faf460] die at ffffffff81017808
 #4 [ffff880212faf490] do_general_protection at ffffffff8169f5d2
 #5 [ffff880212faf4c0] general_protection at ffffffff8169eef5
    [exception RIP: pkt_queue+388]
    RIP: ffffffffa00f3fa0  RSP: ffff880212faf578  RFLAGS: 00010292
    RAX: ffff8802110ae400  RBX: ffff880213a53f38  RCX: 00015d910000a20f
    RDX: 497d74565cede60c  RSI: 000000006df1ed57  RDI: 00000000e46e0cfc
    RBP: ffff880212faf728   R8: ffff880211a8b000   R9: ffff880212fafa60
    R10: ffff880212fafbc8  R11: 0000000000000293  R12: 00000000134ab2b4
    R13: 000000008386615c  R14: 00000000000000e3  R15: 00000000000000e3
    ORIG_RAX: ffffffffffffffff …
Run Code Online (Sandbox Code Playgroud)

kernel crash-dumps kernel-module linux-kernel

8
推荐指数
1
解决办法
3万
查看次数