标签: kernel-module

如何在linux内核2.6中使用CryptoAPI

我一直在寻找一些时间,但没有找到足够的文档/示例,如何使用Linux附带的CryptoAPI来创建系统调用/内核域.

如果有人知道一个好的来源请告诉我,我想知道如何在内核空间内进行SHA1/MD5和Blowfish/AES.

kernel kernel-module cryptoapi linux-kernel

10
推荐指数
3
解决办法
2万
查看次数

拦截文件系统系统调用

我正在编写一个应用程序,我需要拦截一些文件系统系统调用,例如.断开链接.我想保存一些文件说abc.如果用户删除了该文件,那么我需要将其复制到其他地方.因此,在删除abc之前,我需要取消链接以调用我的代码,以便我可以保存它.我已经完成了与拦截系统调用相关的线程,但像LD_PRELOAD这样的方法在我的情况下不起作用,因为我希望这是安全的并在内核中实现,所以这个方法不会有用.事件发生后inotify通知我无法保存它.你能建议任何这样的方法.我想在内核模块中实现它,而不是修改内核代码本身.格雷厄姆·李建议的另一种方法,我曾想过这种方法,但它有一些问题,我需要所有文件的硬链接镜像它不占用空间但仍然可能有问题,因为我必须反复镜像驱动器以保持我的镜像到日期,它也不会工作跨分区和分区不支持链接所以我想要一个解决方案,通过它我可以挂钩到文件/目录,然后观察更改而不是重复扫描.我还想添加对修改文件的写入支持,我不能使用硬链接.我想通过替换系统调用拦截系统调用,但我还没有找到任何在linux> 3.0中执行此操作的方法.请提出一些方法.

linux filesystems system-calls kernel-module intercept

10
推荐指数
1
解决办法
5457
查看次数

使用Linux netfilter将struct iphdr*中的源IP地址转换为等效字符串

我想将源和目标IP地址从使用netfilter捕获的数据包转换为char*.

在我的netfilter钩子函数中,我有:

sock_buff = skb; // argument 2 of hook function

// ip_header is struct iphdr*
ip_header = (struct iphdr *)skb_network_header(sock_buff);

// now how to convert ip_header->saddr & ip_header->daddr to char *
// ip_header->saddr & ip_header->daddr are of type __be32
Run Code Online (Sandbox Code Playgroud)

谢谢.

c linux kernel netfilter kernel-module

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

无法卸载内核扩展; 类具有实例

我正在为音频设备驱动程序(它的软件,但模拟硬件设备)编写OSX内核扩展.

在开发过程中,完全卸载现有的旧版本然后从头开始构建和安装新版本会很方便.但是,如果没有重新启动系统,有时似乎无法进行此操作.

程序本身没有运行,源文件已从/System/Library/Extensions/目录中删除.

kextstat揭示了一个实例:

$ kextstat | grep 'com.foo.driver.bar'
219 0 0xfff123 0x5000 0x5000 com.foo.driver.bar (0.0.1) <102 5 4 3>
Run Code Online (Sandbox Code Playgroud)

(...含义:)

Index Refs Address Size Wired Name (Version) <Linked Against>
Run Code Online (Sandbox Code Playgroud)

所以我的驱动程序实例有0个参考,但kextunload有时会失败,抱怨现有的实例:

$ sudo kextunload -b com.foo.driver.bar
(kernel) Can't unload kext com.foo.driver.bar; classes have instances:
(kernel)     Kext com.foo.driver.bar class FooBarDriver has 1 instance.
(kernel)     Kext com.foo.driver.bar class com_foo_driver_bar has 1 instance.
Failed to unload com.foo.driver.bar - (libkern/kext) kext is in use or retained (cannot unload). …
Run Code Online (Sandbox Code Playgroud)

macos kernel kernel-module kernel-extension

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

拦截系统调用

我一直试图在内核级拦截系统调用.我从这个问题中得到了基本的想法.我试图拦截的系统调用是fork().所以我从System.map中找到了sys_fork()的地址,结果证明是0xc1010e0c.现在我编写了如下模块.

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/unistd.h>
#include<linux/semaphore.h>
#include<asm/cacheflush.h>
MODULE_LICENSE("GPL");
void **sys_call_table;
asmlinkage int (*original_call)(struct pt_regs);
asmlinkage int our_call(struct pt_regs regs)
{
    printk("Intercepted sys_fork");
    return original_call(regs);
} 
static int __init p_entry(void)
{
    printk(KERN_ALERT "Module Intercept inserted");
    sys_call_table=(void *)0xc1010e0c;
    original_call=sys_call_table[__NR_open];
    set_memory_rw((long unsigned int)sys_call_table,1);
    sys_call_table[__NR_open]=our_call;
    return 0;
}
static void __exit p_exit(void)
{
    sys_call_table[__NR_open]=original_call;
    set_memory_ro((long unsigned int)sys_call_table,1);
    printk(KERN_ALERT "Module Intercept removed");
}
module_init(p_entry);
module_exit(p_exit);
Run Code Online (Sandbox Code Playgroud)

但是,在编译模块后,当我尝试将其插入内核时,我从dmesg输出中得到以下内容. 在此输入图像描述 在此输入图像描述

当然它不会拦截系统调用.你能帮我解决问题吗?我使用的是3.2.0-4-686版本的Linux内核.

c linux kernel kernel-module linux-kernel

10
推荐指数
2
解决办法
2839
查看次数

用于多个进程的内核驱动程序中的内存池

假设我们想要在设备驱动程序或模块中维护一个内存池.如何创建该池并使其可用于多个进程,可以说4个进程,访问此驱动程序/模块.

假设池中有1 MB内存.

当我读LDD时,我遇到了api的mempool_create(),但之后还有kmalloc.

如果有人做了这样的事情,请分享知识.

我最初的方法是使用kmalloc()进行分配,然后为打开模块的每个进程维护私有对象中的开始和结束指针.

编辑:谢谢@kikigood花了一些时间在这上面.所以基于你的评论,我做了这样的事情.

假设我在初始化期间分配了1MB的mempool.我想将进程数限制为4,所以我保持计数.每次都增加这个数量

atomic_t count =0;
    open()
    { 
        if(count >4) 
            return -ENOMEM;
        count++; 
    } 
Run Code Online (Sandbox Code Playgroud)

我还在每个进程的私有设备结构中维护一个缓冲区.

如何将池中的某些内存分配给此缓冲区.

memory-management kernel-module linux-device-driver linux-kernel kmalloc

10
推荐指数
1
解决办法
742
查看次数

从内核空间配置LED触发器的参数

我正在开发一个嵌入式项目.我们的主板使用的是Linux内核v3.16.7.我正在努力支持一些监控活动的外围LED.我已经成功地修改了启动过程来加载驱动程序,并创建sysfs的条目/sys/class/leds/,这是伟大的.我还将一个单触发器连接到LED上,这样我就可以echo 1 > shot从内部/sys/class/leds/actled1\:green/和LED 闪烁.正是我想要的.

但是,我想在启动过程中实例化驱动程序时配置每个LED的延迟,我不清楚如何做到这一点.司机在创建的sysfs条目/sys/class/leds/actled1\:green/delay_ondelay_off了,我可以从用户空间写信给他们配置的延迟,但它应该是可能的实例化过程中从内核空间设置的初始值.我还希望能够设置invert参数(这只是延迟时的另一个sysfs条目).

当我从内核空间实例化驱动程序时,如何配置led触发器的参数?

以下是我实例化LED GPIO的方法.首先,我设置所需的结构:

static struct gpio_led my_leds[] __initdata = {
    {
        .name = "actled1:green",
        .default_trigger = "oneshot"
        .gpio = ACTIVITY_LED_GPIO_BASE + 0,
        .active_low = true,
    },
    {
        .name = "actled2:red",
        .default_trigger = "oneshot"
        .gpio = ACTIVITY_LED_GPIO_BASE + 1,
        .active_low = true,
    },
};

static struct gpio_led_platform_data my_leds_pdata __initdata = {
    .num_leds = ARRAY_SIZE(my_leds),
    .leds = my_leds, …
Run Code Online (Sandbox Code Playgroud)

c linux kernel-module linux-device-driver linux-kernel

10
推荐指数
1
解决办法
1843
查看次数

insmod错误:插入'./hello.ko': - 无效的模块格式"

我刚刚制作了我的第一个驱动模块,跟随LDD3的hello world模块.但遗憾的是遇到了这个错误:

insmod: error inserting './hello.ko': -1 Invalid module format.
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu 11.04和我的环境中这样做:

$ uname -r
2.6.38-8-generic
Run Code Online (Sandbox Code Playgroud)

我得到这样的内核源代码:

sudo apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-2.6.38 - Linux kernel source for version 2.6.38 with Ubuntu patches
$sudo apt-get install linux-source-2.6.38
Run Code Online (Sandbox Code Playgroud)

我的/ usr/src:

$ls /usr/src/
linux-headers-2.6.38-8          linux-source-2.6.38          vboxguest-5.0.10
linux-headers-2.6.38-8-generic  linux-source-2.6.38.tar.bz2
Run Code Online (Sandbox Code Playgroud)

然后我编译内核

$sudo cp /boot/config-2.6.38-8-generic ./.config
$sudo make menuconfig -- load the .config file
$make
$make modules
Run Code Online (Sandbox Code Playgroud)

然后我编译我的内核模块

$make -C /usr/src/linux-source-2.6.38/linux-source-2.6.38 M=`pwd` modules
Run Code Online (Sandbox Code Playgroud)

使用Makefile:

obj-m := hello.o
Run Code Online (Sandbox Code Playgroud)

然后最后当我插入模块时: …

linux kernel-module linux-device-driver linux-kernel embedded-linux

10
推荐指数
1
解决办法
4万
查看次数

Linux内核中的人类可读时间戳

如何在linux内核中编写人类可读的时间戳?我认为do_gettimeofday返回时代,但我不想尝试将其转换为可读时间.我只想要一个像这样的格式Hour:Min:Sec:Msec.谢谢

kernel kernel-module linux-kernel

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

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

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

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

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

c system-calls kernel-module

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