Articles of linux device driver

Linux设备驱动程序3rd Ed和3.2内核

我知道3.2内核主要是一个渐进的步骤,但是我想为我正在开发的项目使用一些简单的设备驱动程序。 Linux设备驱动程序第三版(Corbet,Rubini和Kroah-Hartman,O'Reilly)中的信息仍然密切相关,或者在2.6和3.2之间有什么重大区别? 一般人对这本书有什么看法?

尽pipeEXPORT_SYMBOL模块插入“模块中的未知符号”

我正在编译并插入r8169 realtek以太网驱动程序。 我的内核版本是 ebin@sony:~$ uname -r 4.2.0-rc3-custom 我有我的本地磁盘,用于安装当前的内核相同的完整源代码。 当我运行make -C /lib/modules/ uname -r /build M= pwd modules时,模块编译成功 但是当我插入模块,它显示 ebin@sony:~/linux_testing/linux-stable/drivers/net/ethernet/realtek$ sudo insmod r8169.ko insmod: ERROR: could not insert module r8169.ko: Unknown symbol in module ebin@sony:~/linux_testing/linux-stable/drivers/net/ethernet/realtek$ dmesg [16717.311216] r8169: Unknown symbol mii_ethtool_gset (err 0) 当我通过消息来源,我发现 EXPORT_SYMBOL(mii_ethtool_gset); 已经在mii.c导出了。 所以我想这不是未标记的问题。 让我知道如果我必须提供任何其他信息。 请帮忙。

查找进程在哪个进程中运行

有什么办法可以让我的CPU在哪个CPU进程正在运行?

request_irq中的dev_id参数是什么?

在函数声明中 int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char *devname, void *dev_id); dev_id是一个“in”参数还是一个“out”参数? 我们从哪里得到这个号码?

在设备上使用epoll(/ dev / event / …)是否有效?

我正在创build一个单线程的 applet,它创build一个代理虚拟设备(更确切地说是一个虚拟的Xbox 360 pad)。 我设法使用uinput接口创build它,我正确地设置它,它工作得很好。 为了给这个虚拟设备提供命令,我从另一个真实接口(在这个例子中是一个PS3键盘)读取事件,并用这些标记打开真实的设备文件: fd = open("/dev/input/event22", O_RDONLY); // open the PS3 pad 主循环是类似的(减去错误检查): while(run) { input_event ev = {0}; read(fd, &ev, sizeof(struct input_event)); // convert from PS3 –> Xbox 360 convert(ev); // write to the new virtual pad write(fd_virtual, &ev, sizeof(struct input_event)); } 你可以想象read(fd, &ev, sizeof(struct input_event)); 是一个阻塞调用,我想有一个超时周期循环,并检查其他事件/执行其他代码。 由于这些原因,我正在考虑封装read(fd…呼叫epoll循环,所以我也可以有一个超时。 问题是,以这种方式完成是否有效率? 通过使用epoll_wait ,我是否会在当前循环中引入额外的延迟,从而延迟虚拟键盘的响应时间?

打开固件设备树的概述/参考手册

我正在尝试为embedded式PowerPC板设置驱动程序,而今天正确的方法是使用OpenFirmware设备树数据结构(从.dts文件编译的.dtb文件)。 创build树是非常简单的,但是如何让我的设备驱动程序find它的节点和数据呢? 我还没有设法find任何好的参考,像“Linux设备驱动程序”这样的书籍太多到x86地区,对于大多数与基于Power Architecture的设备相关的设备树(Linux内核中的arch powerpc)术语)。

什么是Linux内核的DMA映射和DMA引擎?

什么是Linux内核的DMA映射和DMA引擎? 当DMA映射API和DMA引擎API可以在Linux设备驱动程序中使用? 任何真正的Linux设备驱动程序示例作为参考将是很好的。

Linux内核模块/ IOCTL:不适用于设备的ioctl

我正在编写一个作为伪驱动程序的Linux内核模块(LKM) – 我无法弄清楚如何在LKM( wait.c )和用户级程序( user.c )之间进行IOCTL调用)。 设备驱动程序的幻数是0xBF – LKM不与物理块/字符设备通信,这只是一个练习。 从我所知道的情况来看,调用KERN_IOCTL_CREATE_EVENT的IOCTL格式不正确,幻数也不正确。 我尝试使用的IOCTL调用是: #include <sys/ioctl.h> #define KERN_IOCTL_CREATE_EVENT _IOWR(WAIT_DEVICE_MAGIC, 1, int) int main(){ int ret; int fd; fd = open("/dev/wait", 0); if(fd < 0){ return -1; } ret = ioctl(fd, KERN_IOCTL_CREATE_EVENT, 0); 错误: [fail]: KERN_IOCTL_CREATE_EVENT: Inappropriate ioctl for device 用户模式应用程序可以打开/closures指向设备的文件描述符: /dev/wait但case / switch语句不接受IOCTL调用。 有什么build议么? 这是# uname -a的输出 […]

内置的内核驱动还需要设备树吗?

如果我将内核驱动程序作为module构build,那么可以在运行时用insmod或modprobe手动将其插入到内核中,我很清楚。 但下面关于设备树的说法正确吗? 如果我将内核驱动程序作为module构build,它将在引导时自动插入内核,具体取决于它是否在设备树中列出 如果我将内核驱动程序构build为built-in驱动程序,则无论设备树如何,它都将在引导时自动插入到内核中

通过内核模块轮询循环设备

我试图读取我通过内核模块在200ms内创build的回送设备,但是当我尝试插入内核时,它正在崩溃内核。 我认为我的阅读模块有问题,但它没有定时器正常工作。 我是内核编程新手,请帮忙。 预先感谢您:D #include <linux/kernel.h> #include <linux/module.h> #include <linux/timer.h> #include<linux/fs.h> #include <linux/init.h> #include <asm/segment.h> #include <asm/uaccess.h> #include <linux/buffer_head.h> static struct timer_list my_timer; static void read_file(char *filename) { struct file *fd; char buf[1]; unsigned long long offset=0; mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); fd = filp_open(filename, O_RDONLY, 0); if (fd >= 0) { printk(KERN_DEBUG); while (vfs_read(fd, […]