Tag: linux device driver

怀疑linux中的container_of宏

为什么我们使用container_of宏? container_of(pointer, container_type, container_field); 据LDD说 “这个宏在一个类型为container_field的结构中接受一个名为container_field的字段的指针,并返回一个指向包含结构的指针”。 我的问题是: 如果我们想要一个指向结构的指针(即container_type),我们可以直接分配,对吧? 那为什么其中一个字段的指针被用来为整个结构分配地址? 任何人都可以用一个例子解释使用该宏的优势吗?

从读取设备数据流中丢失流量控制数据(0x13)

我编写了一个Linux应用程序,通过模拟串行端口的USB端口读取和写入二进制数据到远程设备。 当我从设备读取数据时,我有一个USB嗅探器,显示这样的二进制数据流(0x01,0x0A …… 0x13),但是当我的程序读取字节时,0x13不在字节流中 – 这是XOFF char,但我没有使用XON / XOFF流控制(我认为)。 尝试打开读取和写入,以及在二进制模式下fopen fread和fwrite,同样的结果。 有任何想法吗?

如何在没有内核崩溃的情况下优雅地禁用中断线?

我已经实现了一个从keyboad读取的程序,并扫描代码并将其放入tasklet中。 tasklet取消阻塞read()。 因此,我的QT应用程序可以读取数据,如果它找到l的扫描代码,它会触发对Qt-webkit的回调。 但是,当我在做我的角色驱动程序的rmmod时。 整个内核崩溃了。 我的角色驱动程序有什么问题。 #include #include /** needed by all modules **/ #include /** This is for KERN_ALERT **/ #include /** for file operations **/ #include /** character device **/ #include /** for sys device registration in /dev/ and /sys/class **/ /** for copy_to_user **/ #include /** kernel thread */ #include /** spin […]

从内核空间代码访问文件?

我正在浏览源代码“ drivers / staging / comedi / drivers / serial2002.c ”,实现提示从内核空间代码访问文件。 系统调用(读,写)提供了一个标准接口,可防止对h / w和其他系统资源的错误访问。 简而言之,应该从用户空间访问设备文件。 所以我很困惑为什么我们需要从内核空间访问文件,因为这种实现不提供安全function。 请提供指针,了解原因。

在linux内核中嵌入锁定的动态分配/自由结构

我想释放一个嵌入了spin_lock的结构。 场景如下: 我有两个function f1 () { ***************** spin_lock_irqsave(&my_obj_ptr->my_lock, flags) …. …. …………………………………. here f2 is called spin_lock_irqstore(&my_obj_ptr->my_lock, flags) ******************* kfree(my_obj_ptr) } 和f2具有与f1类似的内容。 当f2被调用时,正在使用my_lock,f2必须忙着等待。 但是,当f2进入临界区时,my_obj_ptr是免费的。 内核崩溃…… 我现在想的是在struct my_obj中添加一个ref_count变量 在spin_lock_irqsave => ref_count ++之前 在spin_lock_irqstore => ref_count–之后 在免费之前,请检查ref_count变量。 现在似乎没有崩溃。 我只是想知道是否会有角落案件,我不考虑? 或者有更好的方法来处理这个问题? 任何帮助将不胜感激。 谢谢

从用户空间应用程序调用内核空间中的用户定义函数

我在我的设备驱动程序中编写了一个用户定义的函数,我想从用户空间应用程序中调用它。 我该如何实现这一目标? 我所说的用户定义函数是除了内核定义函数之外的任何函数。 在struct file_operations定义的指针,如下所示。 struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct […]

环回模式启用?

我希望使用omap4的uart4实例的应用程序代码来测试软件循环。我正在使用默认驱动程序。 我将如何使用ioctl?或任何其他方式。 请在此处找到驱动程序代码omap-serial.c 。 请分享任何参考代码。

linux-kernel模块最大分配内存

我想编写一个模块,其任务是捕获传入的数据包,而不将它们发送到用户空间应用程序并对捕获的数据包进行一些修改。 然后该模块将发送此数据包以传输到NIC。 但主要的问题是我的模块尺寸非常大而且还进行了大量的处理。 因此,在内核模块内部进行此处理是好的,还是应该将信息和数据包传递给用户空间进行处理以避免复杂性。 &我这样做只是为了快速获取数据包处理。 所以最大化linux内核模块可以分配多少内存。

如何从LKM获取Linux内核的数据段

我正在编写一个涉及tasklist_lock , __bss_start的内核模块。 这些符号不会导出。 我很确定即使没有导出,我们也可以使用kernsym_lookup_name()从文本部分访问符号 参考linux 3.2.28上的自定义模块如何调用print_cpu_info? $ vim System.map … 80017be0 T register_undef_hook 80017c28 T unregister_undef_hook 80017c70 T do_unexp_fiq … 806eb000 D mmlist_lock 806eb040 D tasklist_lock 806eb080 d softirq_vec …. T代表文本符号。 D和d表示数据段符号。 我可以使用kallsyms_lookup_name()访问register_undef_hook()和unregister_undef_hook() kallsyms_lookup_name() 。 但不是tasklist_lock 。 请分享您的知识,以便从内核模块(LKM)访问tasklist_lock 。

如何在以下简单设备读取程序中使用“cat”

static ssize_t device_read (struct file* filp, char *bufStoreData, size_t bufCount, loff_t* curOffset) { printk(KERN_INFO”reading from the device”); ret = copy_to_user(bufStoreData,virtual_device.data,bufCount); return ret; } copy_to_user是否返回剩余要读取的字节数或读取的字节数? 如果我使用猫,我会使用bufcount 如果所有数据都没有在单个调用中读取它如何读取剩余数据?应用程序的责任是再次发出系统调用还是驱动程序自动运行? 我需要了解这个基本概念。