标签: kernel-module

从linux内核模块访问串行端口

你好Linux内核驱动大师!

我正在为使用串行接口进行配置的相机编写v4l2驱动程序.我希望驱动程序配置相机,因为它可以保持客户端代码在相机型号之间保持一致.问题是:从驱动程序模块访问摄像机串行接口的最佳方法是什么?

从我所听到的,从内核驱动程序访问文件是一个很大的禁忌,但它可以做到.因此,我目前正在使用以下代码片段,但感觉就像一个黑客.

oldfs = get_fs();
set_fs(KERNEL_DS);

fd->f_pos=0;
fd->f_op->write(fd, data, data_len, &fd->f_pos);

set_fs(oldfs);
Run Code Online (Sandbox Code Playgroud)

我的问题是:这是正确的方法吗?

serial-port kernel-module linux-device-driver linux-kernel

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

获取内核模块中的当前时间(秒)

在内核模块中以秒(自纪元开始)获取当前时间的标准方法是什么?

我已经看到了涉及获取xtime的技术,这些技术非常冗长且涉及while循环和锁定.肯定有更好的办法.

[这不是重复的.我已经查看了之前的问题.许多这些的答案要么没有指定使用的函数,要么错误地引用内核中不允许的time.h]

c time kernel-module linux-kernel

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

Linux内核是否有自己的SSE/AVX上下文?

Linux内核是否有自己的SSE/AVX上下文?

我的意思是,从内核模块的角度来看,我可以使用SSE/AVX指令而不必担心可能也会使用它的用户空间应用程序吗?或者我是否需要使用某些锁或手动执行某些上下文保存?

sse kernel-module linux-kernel avx

11
推荐指数
1
解决办法
2037
查看次数

Docker加载内核模块

我试着安装一个内核模块xfsprogs.它已成功安装在容器内.这确实令人惊讶,但lsmod没有在容器或主机系统中列出此模块.如何在容器中加载新的内核模块?(CentOS容器,Ubuntu主机)

kernel kernel-module docker

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

测试内核模块

我对模拟函数和全局变量感兴趣,以便对内核模块进行单元测试.

最初尝试使用https://github.com/ThrowTheSwitch/CMock但遇到了问题.关于如何做到这一点的任何文章链接也会很棒.(对于内核模块).在这里提供更多细节:编译作为内核模块会出错,因为stdio不可用,编译用户空间会出错,因为它找不到像printk这样的东西.

理想情况下,我会有一个用户级可执行文件或一个内核模块,可以在我的函数上运行单元测试.我遇到麻烦的部分是模拟全局依赖,比如函数所依赖的结构,以便编写一个体面的测试.

我已经阅读了一些关于此的问题文章 , 但没有找到答案,或者为什么这是不可能的明确理由.

c linux kernel-module linux-kernel

11
推荐指数
1
解决办法
1370
查看次数

如何在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万
查看次数

从内核空间配置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
查看次数