我正在阅读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) 此调用返回的DMA地址是否与物理地址相同?LDD3表示驱动程序应将DMA地址视为不透明.我想mmap这个DMA缓冲区,以便用户空间可以直接读/写它.问题是我应该为remap_pfn_range指定PFN(现在令我惊喜的是(内核3.4+)适用于传统内存,与I/O内存相同).我可以将DMA地址转换为无符号长并将其转换为PFN吗?这不违反LDD3关于不透明性的说法吗?
是否dma_alloc_coherent总是使用__get_free_pages内部?这是否意味着该区域可能总是过度分配(因为第一个函数占用字节而第二个函数以页为单位分配)?
有没有办法为从调用中获得的多个连续页面设置单个流映射__get_free_pages?dma_map_page仅适用于单个页面.
谁能解释一下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)
所有这些参数的作用是什么以及它们如何用于遍历列表.
提前致谢
假设缓冲区是使用基于页面的方案分配的.实现mmap的一种方法是使用remap_pfn_range,但LDD3表示这对常规内存不起作用.看来我们可以通过使用SetPageReserved标记保留的页面来解决这个问题,以便它被锁定在内存中.但是并非所有内核内存都已经不可交换,即已经保留了吗?为什么需要明确设置保留位?
这是否与从HIGH_MEM分配的页面有关?
是否可以在Javascript中编写硬件驱动程序?这项任务需要的步骤是什么?
此外,我不确定在哪里发布,所以任何有关这方面的建议也是受欢迎的.我希望这是问题的准确位置.
我找到devm_kzalloc()并kzalloc()在设备驱动程序programmong.但我不知道何时/何地使用这些功能.任何人都可以请说明这些功能的重要性及其用法.
我写的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中的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设备驱动程序可以获得的子集?
我编写了一个linux驱动程序,ioremaps将特定设备的PCI BAR0导出到sysfs二进制属性,允许用户空间直接控制它.
当我尝试在属性之上进行MMAP以直接访问该位内存(来自userland程序)时,问题就出现了.读取成功并返回预期值,但是当我写入该内存时,它似乎缓存在内核和内存之间的某处,而不是传递给GMCH根复合体(因此也就是设备).我想做的是每次访问后都有一个隐含的写内存屏障.
跟进:
模块名称: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 …
linux-kernel ×5
linux ×4
c ×3
dma ×1
driver ×1
ecmascript-5 ×1
javascript ×1
kernel ×1
list ×1
mmap ×1