Articles of 驱动程序

如何找出SCSI设备(说/ etc / sda)是否通过ioctl调用或其他磁盘?

如何通过ioctl调用或其他方式找出SCSI设备(比如/ dev / sda)是否是磁盘? 我已经尝试了以下,但ioctl调用失败。 我的/ dev / sda是​​一个USB闪存盘。 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <scsi/scsi.h> #include <scsi/sg.h> #include <sys/ioctl.h> int main(int argc, char** argv) { char *dev = "/dev/sda"; struct sg_scsi_id m_id; int rc; int fd; fd = open(dev, O_RDONLY | O_NONBLOCK); if (fd < 0) { […]

kmalloc()kcalloc()vmalloc()和kzalloc()之间有什么区别?

Hi all, 我目前正在debugging设备驱动程序,我得到一个内核恐慌。 检查回溯或错误日志后,似乎问题是与kmalloc。 我想也许我可以用其他分配函数来改变kmalloc。 他们有什么不同? 这里是错误日志: Unable to handle kernel NULL pointer dereference at virtual address 0000000d pgd = c7bdc000 [0000000d] *pgd=4785f031, *pte=00000000, *ppte=00000000 Internal error: Oops: 17 [#1] PREEMPT Modules linked in: bcm5892_secdom_fw(P) bcm5892_lcd snd_bcm5892 msr bcm5892_sci bcm589x_ohci_p12 bcm5892_skeypad hx_decoder(P) pinnacle hx_memalloc(P) bcm_udc_dwc scsi_mod g_serial sd_mod usb_storage CPU: 0 Tainted: P (2.6.27.39-WR3.0.2ax_standard #1) […]

如何正确发送路由器广告?

我正在开发一个没有设备的IPv6 linux设备驱动程序。 所以我现在试图欺骗虚假的路由器广告信息的内核。 unsigned char c[] = {0x33, 0x33, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 61, 0x86, 0xdd, //IPv6 type 0x60, 0x00, 0x00, 0x00, //Version, … 0x00, 24, //payload length 58, //next header 255, //hop limit 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x3d, […]

Ubuntu 13.10无法满足依赖libpackagekit-glib2-14

我刚刚在我的笔记本电脑上安装了Ubuntu 13.10,而不是升级,而是作为一个干净的安装。 一切工作都很好,除了我现在试图从官方页面安装英特尔graphics驱动程序,并遇到依赖性错误。 这个软件包要求libpackagekit-glib2- 14,并且由于缺乏包含在repos中(据我所知)。 我已经安装了libpackagekit-glib2- 16 ,但据我所知,没有办法恢复到14,或者一起安装。 如果有人能给我一些解决scheme的指导,我会非常感激。

在Linux内核中实现正确的模块间同步

我为某个基于ARM的Linux电路板(实际上是一个自定义UART驱动程序)实现了一个自定义串行总线驱动程序。 该驱动程序应通过自定义协议与总线另​​一端的某个MCU进行通信。 驱动程序不会(也不能 )将其任何function暴露给用户空间,也不可能在用户空间中实现它(因此,需要定制驱动程序而不是使用库存TTY子系统)。 驱动程序将实现通信协议和UART读/写,并且必须向用户输出一组更高级的function以允许它们与MCU通信(例如, read_register() , drive_gpios() ,所有这些) 。 这个模块只有一个用户。 调用模块将不得不等待操作完成(前面提到的read_register()等)。 我目前正在考虑使用信号量:用户模块将调用我的驱动程序的function,它将启动传输并等待信号; 我的驱动程序的IRQ处理程序将向MCU发送请求并读取答案,并在完成后发送到信号量,从而唤醒调用模块。 但是我对内核编程并不是很熟悉,而且我对许多可能的替代实现(tasklets?wait queues?)感到困惑。 问题是:我的信号量的方法是好的,还是太天真? 什么是可能的select? 有没有我可能错过的陷阱?

Linux设备驱动程序允许FPGA直接DMA到CPU RAM

我正在写一个linux设备驱动程序,允许一个FPGA(通过PCI express连接到PC)直接将数据直接写入CPU RAM中。 这需要在没有任何交互的情况下发生,并且用户空间需要访问数据。 一些细节: – 运行64位的Fedora 14 – 系统有8GB的RAM – FPGA(Cyclone IV)位于PCIe卡上 为了实现这一点,我执行了以下操作: – 在memub中保留了2GB的RAM,使用memmap 6GB $ 2GB(无法启动,我添加了mem = 2GB)。 我可以看到/ proc / meminfo中保留了高2GB的RAM – 映射BAR0允许读写FPGA寄存器(这个工作完美) – 在我的驱动程序中使用remap_pfn_range()实现了mmap函数 – 使用ioremap获取缓冲区的虚拟地址 – 添加ioctl调用(用于testing)将数据写入缓冲区 – 通过进行ioctl调用将数据写入缓冲区并validation数据在用户空间的缓冲区中来testingmmap 我面临的问题是当FPGA开始DMA数据到我提供的缓冲区地址。 我不断得到PTE错误(从DMAR :)或与下面的代码我得到以下错误:DMAR:[DMA写入]请求设备[01:00.0]故障地址186dc5000 DMAR:[故障原因01]根目录中的当前位清零DRHD:处理故障状态寄存器3 根据FPGA的DMA,第一行的地址每次增加0x1000 这是我的init()代码: #define IMG_BUF_OFFSET 0x180000000UL // Location in RAM (6GB) #define IMG_BUF_SIZE 0x80000000UL // Size of […]

Linux驱动程序通过sysfs访问

我正在做一个小的内核模块来提供用户空间访问一些ARMv7芯片的内核模式特性(特别是caching控制)。 我正在阅读Corbet,Rubini和Hartman的Linux设备驱动程序 。 其中他们描述了如何制作完整的驱动程序+设备+总线。 我根本不想创造一个公交车司机。 事实上,我所做的“驱动程序”实际上并不需要与设备定义相匹配 – 它隐含地与平台的CPU匹配。 任何人都可以向我解释: 我的属性去哪里在sysfs? 它应该在/sysfs/modules/mymodule下的模块条目中吗? /sys/devices/platform似乎也很有希望,而/sys/devices/system/cpu 。 如果有一个地方我应该把我的kobject /属性,我怎么把它插入它? 我如何获得必要的kset ? 我见过的所有例子创build一个kset ,然后从kobject链接到它 – 我还没有看到一个API请求一个现有的命名kset ? 对不起,如果这只是不可能的明显的,或者有一些真正直截了当,容易发现的例子,我没有发现,因为某些原因。 任何人都可以解释这一点吗?

Linux陷入CPU软locking?

我的系统是一个CentOS 6.3 (运行内核版本2.6.32-279.el6.x86_64 )。 我有一个可加载的内核模块,它是一个pipe理PCIe卡的驱动程序。 如果我在OS启动并运行时手动插入使用insmod的驱动程序,则驱动程序将成功加载并运行。 但是,如果我尝试使用rpm安装驱动程序,然后重新引导系统,在启动过程中,操作系统卡住了所有CPU核心的“软locking”消息,除了一个处于“软locking”状态的核心我的驱动程序创build的线程之一。 BUG: soft lockup – CPU#X stuck for 67s! [migration/8:36] …….(same above message for all cores except one) BUG: soft lockup – CPU#10 stuck for 67s! [mydriver_thread/8:36] (one core is locked up in one of the threads in my driver). 我在网上查了很多关于这个msg / bug的信息,有很多关于它的文章,关于什么原因或者怎样debugging都没有。 以下问题的任何帮助真的不胜感激: 我无法login系统,我想这是因为所有内核都处于“软locking”状态,因此无法从shell提示符处触发内核转储。 我启用SysRq,并试图触发与SysRq键组合的内核转储,但没有运气。 看来,系统没有响应键盘(甚至没有响应CapsLockbutton)。 有关如何在这种情况下可以触发内核转储的任何build议? 我可以想象我的驱动程序线程可能导致“软locking”。 […]

USB存储驱动程序如何在Linux中工作?

我正在试图找出USB存储驱动程序在Linux中的工作原理。 我正在寻找一个简单的文章,甚至是描述它是如何工作的图片/stream程图。 基本上,我希望得到这些问题的答案: 将设备插入计算机时,会发生什么情况? 有没有一个守护进程,或者事件触发中断的地方? 在将控制权交给USB存储驱动程序之前,核心USB驱动程序是否读取有关设备的信息? 它如何决定它是什么types的设备? 设备如何安装,以及什么使它能够与计算机的文件系统进行通信? 当我复制一个文件时,内核中的数据stream是什么样子的? 我希望这个问题不是太模糊 – 我试过Google没有用,所以我想知道是否有人知道任何可以解释这个问题的文章或图表,或者如果他们能够自己解释而不需要太多的努力。 谢谢。

libusb接口已经声明

我正在写一个使用libusb的USB设备的设备驱动程序。 当我尝试声明设备时,出现错误代码LIBUSB_ERROR_BUSY(-6)。 根据文件,这意味着该设备已被声称( 链接 )。 如何找出哪个驱动程序/程序声明了该设备,更重要的是,我自己如何声明该设备。 代码片段: r = libusb_claim_interface(handle[0], 0); if (r < 0) { fprintf(stderr, "libusb_claim_interface error %d\n", r); goto out_release; } printf("claimed interface\n"); 输出: libusb_claim_interface error -6