我尝试编写一个事件工作队列,但我遇到了一些问题。
我使用的是 Linux 2.6.36 内核。并且 DECLARE_WORK 函数从 3 个参数更改为 2 个。
问题是,旧的声明是
DECLARE_WORK (struct work_struct name, void (*func)(void *), void *data);
Run Code Online (Sandbox Code Playgroud)
而新的是
DECLARE_WORK (struct work_struct name, void (*func)(void *));
Run Code Online (Sandbox Code Playgroud)
我认为 void *data 指针是给 func 参数。那正确吗?我如何使用新版本的 DECLARE_WORK 做到这一点?
谢谢您的帮助
彼得
我正在尝试创建一个具有结构的内核模块,我想在用户空间应用程序中使用相同的结构,并且该应用程序与给定的模块一起工作。
主要问题是这个结构包含一个名为spinlock_t type. 在内核中用于锁定但不知道如何在用户空间应用程序中使用它。
struct new_struct
{
...some variable...
spinlock_t u_lock;
};
Run Code Online (Sandbox Code Playgroud)
有没有办法在用户空间应用程序中使用自旋锁。
或者是否有任何其他锁定技术可以在内核和用户空间中使用,以便如果锁定由用户应用程序持有,内核模块应该无法获得它,反之亦然。
在编写驱动程序时,我遇到了下面提到的问题。
假设多线程应用程序通过相同的 FD 访问相同的设备文件。考虑在对 OPEN 和 RELEASE 的调用之间,线程组相互持有一些资源(比如互斥锁)。这些资源在 READ/WRITE 调用期间使用,然后最终在 RELEASE 期间放弃或销毁。
如果在 READ/WRITE 期间有一个线程访问资源,而另一个线程同时通过调用 close 调用 RELEASE,则 VFS 如何确保在 READ、WRITE 或 READ 中至少有一个线程之前不会调用 RELEASE喜欢。什么机制处理这种保护?
我正在开发一些网络驱动程序,我正在尝试根据 ip::tos 值将数据包分配到不同的队列。出于测试目的,我正在运行:
ping -Q 1 10.0.0.2
Run Code Online (Sandbox Code Playgroud)
将 ip::tos 值设置为 1。我遇到的问题是,在我运行 ping 命令的这个系统上 - 传出 skb 具有 skb->priority==0,但我认为它应该是 1。
我假设设置“-Q 1”会将 skb->priority 设置为 1,但事实并非如此。
有谁知道为什么?
有没有办法在编译 linux 内核时将参数传递给内置内核模块?如果是,你能解释一下如何吗?我想将 max_bonds 的值传递给我内核中内置模块的绑定驱动程序。
Linux 内核版本 - 2.6
受人尊敬的书籍Linux Driver Development说
flags传递给的参数spin_unlock_irqrestore必须是传递给的相同变量spin_lock_irqsave.你还必须打电话spin_lock_irqsave并spin_unlock_irqrestore使用相同的功能; 否则你的代码可能会破坏某些架构.
然而,我找不到与内核代码本身捆绑在一起的官方文档所要求的任何此类限制.我发现违反此指南的驱动程序代码.
显然,调用spin_lock_irqsave和spin_unlock_irqrestore从单独的函数调用并不是一个好主意,因为你应该在保持锁定的同时最小化完成的工作(禁用中断,不能少!).但是如果对内核进行了更改,那么如果小心翼翼地完成它,它是否真的不会违反API合同,或者它是否仍然禁止这样做?
如果在某些时候删除了限制,它是否适用于版本3.10.17?
linux-device-driver linux-kernel interrupt-handling spinlock
我正在研究内核代码中的UART驱动程序,想知道,谁首先进入图片,device_register()或者driver_register()打电话?
为了区别他们,请遵循此.
在UART探测中,我们打电话
uart_register_driver(struct uart_driver *drv)
Run Code Online (Sandbox Code Playgroud)
成功注册后,
uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
Run Code Online (Sandbox Code Playgroud)
请详细解释一下.
我写了基本的char驱动程序.
使用cdev_alloc,cdev_init,cdev_add完成了使用内核注册char设备.Major = 117,Minor = 1.
cdev_add函数retrun成功.我正在尝试检查是否创建了char设备.我没有在/ dev /或/ dev/char下找到任何设备,主要没有117.
register_chrdev不会在我们提供NAME的最新内核中使用.但是cdev_add仅使用主号执行内核的char设备注册.
我对最新的内核行为感到困惑.
我是否需要将register_chrdev与cdev_add一起使用?或者我需要使用mknod commad在/ dev /中显示设备吗?
谢谢.
我遵循了一些教程,这些教程解释了如何编写Linux内核模块,我有些困惑。即使阅读了官方的“文档”,我仍然对这些概念缺乏理解。
创建了字符设备(register_chrdev)之后,我发现通常使用以下功能的组合:
class_create
class_device_create
device_create
我无法理解,什么是类,设备以及类设备和驱动程序?
以下哪个真正负责创建条目/proc/?
device-driver kernel-module linux-device-driver linux-kernel
linux-kernel ×9
linux ×6
kernel ×2
c ×1
device-tree ×1
locking ×1
mutex ×1
networking ×1
serial-port ×1
spinlock ×1
uart ×1
vfs ×1