你好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)
我的问题是:这是正确的方法吗?
在内核模块中以秒(自纪元开始)获取当前时间的标准方法是什么?
我已经看到了涉及获取xtime的技术,这些技术非常冗长且涉及while循环和锁定.肯定有更好的办法.
[这不是重复的.我已经查看了之前的问题.许多这些的答案要么没有指定使用的函数,要么错误地引用内核中不允许的time.h]
Linux内核是否有自己的SSE/AVX上下文?
我的意思是,从内核模块的角度来看,我可以使用SSE/AVX指令而不必担心可能也会使用它的用户空间应用程序吗?或者我是否需要使用某些锁或手动执行某些上下文保存?
我试着安装一个内核模块xfsprogs.它已成功安装在容器内.这确实令人惊讶,但lsmod没有在容器或主机系统中列出此模块.如何在容器中加载新的内核模块?(CentOS容器,Ubuntu主机)
我对模拟函数和全局变量感兴趣,以便对内核模块进行单元测试.
最初尝试使用https://github.com/ThrowTheSwitch/CMock但遇到了问题.关于如何做到这一点的任何文章链接也会很棒.(对于内核模块).在这里提供更多细节:编译作为内核模块会出错,因为stdio不可用,编译用户空间会出错,因为它找不到像printk这样的东西.
理想情况下,我会有一个用户级可执行文件或一个内核模块,可以在我的函数上运行单元测试.我遇到麻烦的部分是模拟全局依赖,比如函数所依赖的结构,以便编写一个体面的测试.
我一直在寻找一些时间,但没有找到足够的文档/示例,如何使用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) 我正在开发一个嵌入式项目.我们的主板使用的是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) kernel-module ×10
linux-kernel ×6
c ×4
kernel ×4
linux ×4
avx ×1
cryptoapi ×1
docker ×1
filesystems ×1
intercept ×1
macos ×1
netfilter ×1
serial-port ×1
sse ×1
system-calls ×1
time ×1