Articles of linux device driver

如何调整NAPI的投票时间?

我可以理解,Linux中的NAPI将从中断变为轮询模式,以处理高数据包速率。 NAPI使用权重决定每个轮询周期处理多less个数据包; 它还确保每个投票期内的数据包处理不到一个jiffies。 但是,我无法在任何地方find(谷歌)NAPI的投票期限是多less? 我们可以将投票期限改变为我们想要的任何价值吗? 非常感谢您的帮助! 从我所观察到的看来,NAPI的投票时间似乎是2秒,但我想确保我的观察是正确的。

关于Linux中的设备文件

据我所知,Linux中的设备文件不过是用户与实际设备通信的用户界面。 是否有任何其他使用设备文件? 这也意味着如果用户不需要与真实设备通信,我们不需要设备文件? 他们也倾向于将每个真实的设备build模为字符或块或networking设备。 这是真的?

uclinux和设备驱动程序的必要性

通常无MMU的系统也没有MPU(内存保护单元),用户和内核模式之间也没有区别。 在这种情况下,假设我们有一个MMUless的系统和一些映射到CPU地址空间的硬件,那么在内核中是否有设备驱动程序是非常有意义的,如果所有的硬件资源都可以从用户空间访问? 内核代码是否对内存拥有更多的控制权,然后是用户代码?

如何用可加载模块修改Linuxnetworking堆栈?

对于一个项目,我们要修改所有在networking栈上移动的数据。 理想情况下,这应该与协议无关,并应无缝融入“正常”networking堆栈。 基本上,每个数据位必须首先在我们的设备上路由,然后再传递给networking堆栈的其余部分。 在这幅图中,设备应该位于第二层和第三层之间的某处。 我的第一个想法是修改socket.c中的代码( 该图显示了networking数据的常用内核stream程 ),在继续进行正常操作之前先将数据写入我们的设备,但是最好能够加载此function以一个内核模块为例),所以用户可以把它关掉,如果他想。 所以我的问题是:有什么办法可以编写内核模块插入到networking堆栈来获取和修改传入和传出的数据? 提前感谢!

在内核中创build一个简单的只写进程条目

#include <linux/module.h> #include <linux/kernel.h> #include <linux/proc_fs.h> #include<linux/sched.h> #include <asm/uaccess.h> #include <linux/slab.h> char *msg; ssize_t write_proc(struct file *filp,const char *buf,size_t count,loff_t *offp) { copy_from_user(msg,buf,count); printk(KERN_INFO "%s",msg); return count; } struct file_operations proc_fops = { write: write_proc }; int proc_init (void) { proc_create("write",0,NULL,&proc_fops); return 0; } void proc_cleanup(void) { remove_proc_entry("write",NULL); } MODULE_LICENSE("GPL"); module_init(proc_init); module_exit(proc_cleanup); 当我使用命令echo 'hello' > […]

我在哪里可以find/ dev / random驱动程序的源代码?

我想看看/ dev / random如何创build随机数字。 我知道它使用中断产生的熵,但我仍然希望看到源代码以及它是如何工作的。 谢谢

Linux设备驱动程序

我有问题关于我的模块,它正确安装/初始化,但驱动程序的其他部分没有安装或显示在输出中。 static struct i2c_driver qt2120_dev { .probe = qt2120_probe, .remove = qt2120_remove, .owner = { .name = qt2120, .module = THIS_MODULE, } …. } static __init qt2120_init(){ prink("********init******"); ……. } module_init(qt2120_init) static int qt2120_probe(){ prink("********probe******"); ……. } static __devinit qt2120_remove(){ prink("********probe******"); ……. } 只有“/ * * init * ”出现在输出中。 根据输出已将模块安装到i2c。 "bus: i2c. qt2120 as qt2120/input" […]

为什么struct cdev有kobject成员?

很奇怪struct cdev有struct kobject成员,有没有人知道原因?

(无符号*)比(unsigned int *)更好地parsing内存?

我理解无符号和无符号整数的区别。 但是我的问题有点不同 我是ioremaping(linux)一个特定的内存,我想读取内存。 我做了以下thig: func() { unsigned int *p; p = (unsigned int *)ioremap(ADDR,8*sizeof(unsigned int)); for (i = 0; i <= 7; i++) pr_err("p[%d] = %d", i, p[i]); } 这完美的作品。 但是我看到一个标准的代码在执行相同的操作,使用(unsidned *)而不是(unsigned int *)。 这是p是unsigned *p 。 func() { unsigned *p; p = (unsigned *)ioremap(ADDR,8*sizeof(unsigned)); for (i = 0; i <= 7; i++) pr_err("p[%d] = […]

什么是Linux中的net_generic函数include / net / net_namespace.h?

我是Linux开发新手。 我正在研究一个示例Linuxnetworking驱动程序教程,并遇到了net_generic(const struct net * net,int id)函数。 可以解释一下net_generic(const struct net * net,int id)的使用方法,我为它做了google,但是只find头文件。 可以任何一个指向我的资源(网站或书),我可以参考。 谢谢