我想通过LKM添加一个新的系统调用,但我不知道如何做到这一点.也就是说,我知道如果我想添加一个全新的系统调用,我可以查看sys_call_table并查找sys_ni_syscall并替换它,但我很好奇是否可以实际添加到sys_call_table.我意识到这可能不是可能的,因为它是一个固定大小的数组,但我想知道是否有任何其他聪明的方式来添加系统,而无需重写未使用的系统调用号调用.
我复制并粘贴此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) 在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中.我有以下问题
这是我使用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) 我开发了一个内核模块(Android),它为我提供:
PCM
16-bit
48000 Hz
2 channel
Run Code Online (Sandbox Code Playgroud)
我想把它流式传输到Java的Apple机场快线(AEX).
AEX需要44.1 kHz PCM,因此我必须重新采样PCM流.
我有以下可能性,但哪个最好?
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) 我正在创建一个非常简单的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守护进程,它依赖于两个内核模块的存在才能完成它的工作.该程序不直接使用这些(或任何其他)模块.它只需要它们存在.因此,我想以编程方式检查这些模块是否已加载,以便在运行时警告用户.
在我开始做解析/proc/modules或lsmod输出之类的事情之前,某个实用程序函数是否已经存在?喜欢的东西is_module_loaded(const char* name);
我很确定以前曾经问过这个问题.但是,我想我错过了正确的搜索条件.
我需要用自己的实现替换标准系统调用(例如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)
如何更换系统调用?
编辑:有没有内核修补的解决方案?
我有一个内核模块,用于分割传入的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-module ×10
linux-kernel ×6
c ×4
kernel ×4
linux ×2
module ×2
crash-dumps ×1
java ×1
resampling ×1
system-calls ×1