我一直在寻找一些时间,但没有找到足够的文档/示例,如何使用Linux附带的CryptoAPI来创建系统调用/内核域.
如果有人知道一个好的来源请告诉我,我想知道如何在内核空间内进行SHA1/MD5和Blowfish/AES.
我正在编写一个应用程序,我需要拦截一些文件系统系统调用,例如.断开链接.我想保存一些文件说abc.如果用户删除了该文件,那么我需要将其复制到其他地方.因此,在删除abc之前,我需要取消链接以调用我的代码,以便我可以保存它.我已经完成了与拦截系统调用相关的线程,但像LD_PRELOAD这样的方法在我的情况下不起作用,因为我希望这是安全的并在内核中实现,所以这个方法不会有用.事件发生后inotify通知我无法保存它.你能建议任何这样的方法.我想在内核模块中实现它,而不是修改内核代码本身.格雷厄姆·李建议的另一种方法,我曾想过这种方法,但它有一些问题,我需要所有文件的硬链接镜像它不占用空间但仍然可能有问题,因为我必须反复镜像驱动器以保持我的镜像到日期,它也不会工作跨分区和分区不支持链接所以我想要一个解决方案,通过它我可以挂钩到文件/目录,然后观察更改而不是重复扫描.我还想添加对修改文件的写入支持,我不能使用硬链接.我想通过替换系统调用拦截系统调用,但我还没有找到任何在linux> 3.0中执行此操作的方法.请提出一些方法.
我想将源和目标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)
谢谢.
我正在为音频设备驱动程序(它的软件,但模拟硬件设备)编写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) 我一直试图在内核级拦截系统调用.我从这个问题中得到了基本的想法.我试图拦截的系统调用是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内核.
假设我们想要在设备驱动程序或模块中维护一个内存池.如何创建该池并使其可用于多个进程,可以说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
我正在开发一个嵌入式项目.我们的主板使用的是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_on和delay_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) 我刚刚制作了我的第一个驱动模块,跟随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
如何在linux内核中编写人类可读的时间戳?我认为do_gettimeofday返回时代,但我不想尝试将其转换为可读时间.我只想要一个像这样的格式Hour:Min:Sec:Msec.谢谢
我正在编写一个C守护进程,它依赖于两个内核模块的存在才能完成它的工作.该程序不直接使用这些(或任何其他)模块.它只需要它们存在.因此,我想以编程方式检查这些模块是否已加载,以便在运行时警告用户.
在我开始做解析/proc/modules或lsmod输出之类的事情之前,某个实用程序函数是否已经存在?喜欢的东西is_module_loaded(const char* name);
我很确定以前曾经问过这个问题.但是,我想我错过了正确的搜索条件.
kernel-module ×10
linux-kernel ×6
kernel ×5
linux ×5
c ×4
system-calls ×2
cryptoapi ×1
filesystems ×1
intercept ×1
kmalloc ×1
macos ×1
netfilter ×1