标签: linux-device-driver

Linux内核模块:何时使用try_module_get/module_put

我正在阅读LKMPG(参见第4.1.4节.取消注册设备),我不清楚何时使用这些try_module_get / module_put功能.一些LKMPG示例使用它们,有些则不使用它们.

令人困惑的是,try_module_get在2.6.24源代码的193个文件中出现了282次,但在Linux设备驱动程序(LDD3)Essential Linux设备驱动程序中,它们甚至没有出现在单个代码示例中.

我想也许它们与旧register_chrdev接口绑定(由cdev接口取代2.6),但它们只出现在同一个文件中8次:

find -type f -name *.c | xargs grep -l try_module_get | sort -u | xargs grep -l register_chrdev | sort -u | grep -c .
Run Code Online (Sandbox Code Playgroud)

那么什么时候使用这些函数是合适的,它们是否与特定接口或一组环境的使用联系在一起?

编辑

我从LKMPG 加载了sched.c示例并尝试了以下实验:

anon@anon:~/kernel-source/lkmpg/2.6.24$ tail /proc/sched -f &
Timer called 5041 times so far
[1] 14594

anon@anon:~$ lsmod | grep sched
sched                   2868  1 

anon@anon:~$ sudo rmmod sched
ERROR: Module sched is …
Run Code Online (Sandbox Code Playgroud)

kernel-module linux-device-driver linux-kernel

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

关于dma_alloc_coherent的一些问题

  1. 此调用返回的DMA地址是否与物理地址相同?LDD3表示驱动程序应将DMA地址视为不透明.我想mmap这个DMA缓冲区,以便用户空间可以直接读/写它.问题是我应该为remap_pfn_range指定PFN(现在令我惊喜的是(内核3.4+)适用于传统内存,与I/O内存相同).我可以将DMA地址转换为无符号长并将其转换为PFN吗?这不违反LDD3关于不透明性的说法吗?

  2. 是否dma_alloc_coherent总是使用__get_free_pages内部?这是否意味着该区域可能总是过度分配(因为第一个函数占用字节而第二个函数以页为单位分配)?

  3. 有没有办法为从调用中获得的多个连续页面设置单个流映射__get_free_pagesdma_map_page仅适用于单个页面.

linux-device-driver linux-kernel dma

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

解释list_for_each_entry和list_for_each_entry_safe

谁能解释一下linux中list_for_each_entry和... entry_safe循环的工作原理.它像是

list_for_each_entry(type *cursor, struct list_head *list, member)

list_for_each_entry_safe(type *cursor, type *next, struct list_head *list,member)

所有这些参数的作用是什么以及它们如何用于遍历列表.

提前致谢

list linux-device-driver linux-kernel

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

如何将Linux内核缓冲区映射到用户空间?

假设缓冲区是使用基于页面的方案分配的.实现mmap的一种方法是使用remap_pfn_range,但LDD3表示这对常规内存不起作用.看来我们可以通过使用SetPageReserved标记保留的页面来解决这个问题,以便它被锁定在内存中.但是并非所有内核内存都已经不可交换,即已经保留了吗?为什么需要明确设置保留位?

这是否与从HIGH_MEM分配的页面有关?

linux linux-device-driver linux-kernel

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

如何在Javascript中编写设备驱动程序?

是否可以在Javascript中编写硬件驱动程序?这项任务需要的步骤是什么?

此外,我不确定在哪里发布,所以任何有关这方面的建议也是受欢迎的.我希望这是问题的准确位置.

javascript driver linux-device-driver ecmascript-5

16
推荐指数
2
解决办法
6897
查看次数

linux驱动程序编程中devm_kzalloc()和kzalloc()之间有什么区别

我找到devm_kzalloc()kzalloc()在设备驱动程序programmong.但我不知道何时/何地使用这些功能.任何人都可以请说明这些功能的重要性及其用法.

device-driver linux-device-driver linux-kernel

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

如何解释内核中的地址oops

我写的linux设备驱动程序中有一个内核oops.我想确定哪一行负责oops.我有以下输出,但我不知道如何解释它.

这是否意味着我的代码在write_func + 0x63处的指令处崩溃了?如何将EIP中的值与我自己的函数联系起来?反斜杠后的值是什么意思?

[10991.880354] BUG: unable to handle kernel NULL pointer dereference at   (null)
[10991.880359] IP: [<c06969d4>] iret_exc+0x7d0/0xa59
[10991.880365] *pdpt = 000000002258a001 *pde = 0000000000000000
[10991.880368] Oops: 0002 [#1] PREEMPT SMP
[10991.880371] last sysfs file: /sys/devices/platform/coretemp.3/temp1_input
[10991.880374] Modules linked in: nfs lockd fscache nfs_acl auth_rpcgss sunrpc   hdrdmod(F) coretemp(F) af_packet fuse edd cpufreq_conservative cpufreq_userspace cpufreq_powersave acpi_cpufreq mperf microcode dm_mod ppdev sg og3 ghes i2c_i801 igb hed pcspkr iTCO_wdt dca iTCO_vendor_support parport_pc floppy parport ext4 jbd2 crc16 i915 drm_kms_helper drm i2c_algo_bit …
Run Code Online (Sandbox Code Playgroud)

linux kernel linux-device-driver

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

misc驱动程序和char驱动程序有什么区别?

我正在读Linux中的misc驱动程序,我对它们和char驱动程序之间的差异感到有些困惑.一个来源,Linux期刊写道:

Alessandro告诉我们如何使用misc驱动程序注册需要单个入口点的小型设备.

有时人们需要编写"小"设备驱动程序,以支持自定义黑客 - 无论是硬件还是软件.为此,以及托管一些真正的驱动程序,Linux内核导出一个接口,允许模块注册自己的小驱动程序.misc驱动程序是为此目的而设计的.

好的,所以从这里我得到一个简单的驱动程序(在这种情况下有一个入口点),这是一个misc驱动程序.然后另一个源,Essential Linux设备驱动程序,指出:

其他(或其他)驱动程序是具有某些共同特征的简单字符驱动程序.因为misc驱动程序是char驱动程序,所以早期关于char驱动程序入口点的讨论也适用于misc驱动程序.

现在,这似乎是说,其它司机只是字符驱动,但也许一部分功能,而字符驱动可以有多个入口点(如一个ioctl()或一个open()read()电话)

那么,在Linux C编码术语中,char和misc设备驱动程序之间的区别是什么?(除了明显的所有misc驱动程序的主要编号(10)).支持的入口点是否有区别?我的假设是否正确,misc设备驱动程序只有一个完整的char设备驱动程序可以获得的子集?

c linux linux-device-driver

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

如何防止MMAP缓存值?

我编写了一个linux驱动程序,ioremaps将特定设备的PCI BAR0导出到sysfs二进制属性,允许用户空间直接控制它.

当我尝试在属性之上进行MMAP以直接访问该位内存(来自userland程序)时,问题就出现了.读取成功并返回预期值,但是当我写入该内存时,它似乎缓存在内核和内存之间的某处,而不是传递给GM​​CH根复合体(因此也就是设备).我想做的是每次访问后都有一个隐含的写内存屏障.

  • 有没有办法阻止内核缓存写入mmap-ed位的内存?

跟进:

  • 每次访问"接受"的方式后调用msync()来执行此操作?

c linux operating-system mmap linux-device-driver

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

将带空格字符的字符串参数传递给内核模块

模块名称:params.ko


#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/stat.h>
MODULE_LICENSE("Dual BSD/GPL");

static char *mystring = "this is my char string";
module_param(mystring, charp, S_IRUGO | S_IWUSR); 
MODULE_PARM_DESC(mystring, "A char string");

static int __init params_init(void)
{
  printk("Driver is loaded\n");
  printk("   My char string(mystring): %s\n", mystring);
  return 0;
}

static void __exit params_exit(void) { printk("Driver is unloaded\n"); }

module_init(params_init); module_exit(params_exit);

当我使用默认设置时,我可以在加载驱动程序时看到"这是我的字符串".

但是,如果我使用命令行来传递带空格的字符串,它将显示以下错误:

EX1: # insmod ./params.ko mystring="Hello World"

insmod: error inserting './params.ko': -1 Unknown symbol in module

dmesg显示以下信息:

params: Unknown parameter …

c linux-device-driver

15
推荐指数
1
解决办法
3337
查看次数