我对 Linux 内核开发非常陌生,并且在理解其功能时感到困惑create_singlethread_workqueue()。任何人都可以提供一个基本示例,说明它到底做什么create_singlethread_workqueue()以及它的工作是什么INIT_WORK。从我读到的解释来看,它说它为处理器创建一个队列并初始化工作。但无法理解什么是工作,也无法理解如何通过基本示例来理解。
我的 FPGA 中有一个通用 AXI 从设备,带有多个 I/O 寄存器。我想使用 sysfs 接口访问我的寄存器。对于我想要访问的每个寄存器,我创建一个_show和 一个_store函数,但这会需要很多代码。
static ssize_t writereg0_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {
struct axi_register_driver *drv = dev_get_drvdata(dev);
u32 val;
if (kstrtou32(buf, 10, &val) != 0)
return -EINVAL;
iowrite32(val, drv->reg_base + WRITE_OFFSET + 0);
return count;
}
static ssize_t writereg0_show(struct device *dev, struct device_attribute *attr, char *buf) {
struct axi_register_driver *drv = dev_get_drvdata(dev);
u32 reg;
reg = ioread32(drv->reg_base + WRITE_OFFSET + 0);
return sprintf(buf, "0x%x\n", …Run Code Online (Sandbox Code Playgroud) 我正在学习“Linux 设备驱动程序”。我创建了一个名为char_device. 当我从设备读取数据时,它不断将消息打印到终端,使机器无限崩溃。
驱动中读操作的源码:
static ssize_t my_read(struct file *my_file, char __user *buf, size_t len, loff_t *off) {
uint8_t *message = "Hello from the kernel world!\n";
size_t datalen = strlen(message);
if(len > datalen) {
len = datalen;
}
printk(KERN_INFO "Char driver: Read");
if(copy_to_user(buf, message, len)) {
return -EFAULT;
}
return len;
}
Run Code Online (Sandbox Code Playgroud)
用于读取设备的用户空间命令:
cat /dev/char_device
Run Code Online (Sandbox Code Playgroud)
驱动程序不断打印“来自内核世界的你好!” 到终端的消息。
对于 linux 内核设备驱动程序,有file_operations结构体或 fops 结构体,它允许驱动程序为各种文件操作定义处理程序。
我的问题是关于.releasefop 处理程序。
我知道只有在对象的最后一个文件描述符 (fd)关闭(或 munmapped)时才会调用release处理程序。这是在调用并且到达 0 时完成的。filefputfilefile->f_count
但是 - 我不清楚其他文件操作是否可以在另一个线程中同时运行 release输入。
例如:
一个进程的 1 个线程是否可以在(或 fd)的ioctl处理程序中file,而同一进程的另一个线程在release处理程序中?
可以release成为file对象竞争条件的一个因素吗?
当我在基于单板计算机上运行的sudo apt install linux-modules-extra-$(uname -r)Docker 容器中运行时,出现以下错误:Ubuntu 20.04Ubuntu 18.04
E: Unable to locate package linux-modules-extra-4.15.0-143-generic
E: Couldn't find any package by glob 'linux-modules-extra-4.15.0-143-generic'
E: Couldn't find any package by regex 'linux-modules-extra-4.15.0-143-generic'
Run Code Online (Sandbox Code Playgroud)
对我来说,这让我想知道是否可以linux-modules-extra-4.15.0-143-generic安装Ubuntu 20.04?也许它只兼容Ubuntu 18.04?
有人可以帮我澄清一下吗?
usbserial linux-device-driver docker ubuntu-18.04 ubuntu-20.04
我不善于分析算法并试图获得一些知识.由于我对内核感兴趣,linux设备驱动程序或模块编写器编程是这些编程真正需要的分析,如果是,那么一些概念就足够了或者我必须是我的代码的良好分析器或者我可以跳过这个并继续编程知识像C,C++,Linux内核等
谢谢
我正在写一个PCI设备驱动程序,我需要为DMA分配一些内存,我正在使用这个函数:
void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag);
Run Code Online (Sandbox Code Playgroud)
我将dma_handle传递给设备.
这个函数的返回值是我可以在内核中使用的虚拟地址,事情是我不想为每个内存分配保存这个地址.
有没有办法将物理地址dma_handle转换为我可以在内核中使用的地址?像这些函数/宏之一的东西:
virt_to_page(kaddr)
page_to_pfn(page)
Run Code Online (Sandbox Code Playgroud)
是否有phy_to_kvirt宏/函数或任何其他方式将物理地址转换为内核虚拟地址?
谢谢
嗨,我有驱动程序,但我想使其专有,我该怎么做。是否可以将我的驱动程序设置为.so,然后创建包装驱动程序。通过包装驱动程序,我可以访问我的.so库。
我正在尝试编译一个Linux驱动USB转串口设备并获得错误
/root/moxa_usb_to_serial/mxu11x0/driver/mxu11x0.c:307: error: ‘usb_serial_probe’ undeclared here (not in a function)
/root/moxa_usb_to_serial/mxu11x0/driver/mxu11x0.c:308: error: ‘usb_serial_disconnect’ undeclared here (not in a function)
Run Code Online (Sandbox Code Playgroud)
我有linux
Linux host 3.10.33-rt32.34.el6rt.x86_64 #1 SMP PREEMPT RT Wed May 28 09:57:12 CEST 2014 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
司机制造商实际上警告说,3.4以上的驱动程序可能不是可分隔的.然而,驱动程序本身相当小,我相信我可以做一些微不足道的修复.怎么解决这个问题?
我正在尝试使用ppc64(power pc)计算机上的自定义驱动程序在特定的pci设备上进行重置。
该驱动程序可在另一台ppc64计算机上使用。
这是负责执行此操作的功能。我删除了几行代码以强调重要的流程。
int reset_device(void)
{
pdev = g_reset_info.devs[ix];
err = pci_enable_device(pdev);
if (err) {
return err;
}
pci_set_master(pdev);
err = pci_save_state(pdev);
if (err) {
return err;
}
pdev = g_reset_info.devs[ix];
err = pci_set_pcie_reset_state(pdev, pcie_hot_reset);
if (err) {
return err;
}
msleep(jiffies_to_msecs(HZ/2));
msleep(jiffies_to_msecs(HZ/2));
pdev = g_reset_info.devs[ix];
err = pci_set_pcie_reset_state(pdev, pcie_deassert_reset);
if (err) {
return err;
}
pdev = g_reset_info.devs[ix];
pci_restore_state(pdev);
msleep(jiffies_to_msecs(HZ/2));
msleep(jiffies_to_msecs(HZ/2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是来自dmesg的输出:
mst_ppc_pci_reset_driver reset_device 63 Send hot reset to device: 0000:50:00.0
mst_ppc_pci_reset_driver reset_device 81 Deassert …Run Code Online (Sandbox Code Playgroud) linux-kernel ×8
linux ×6
c ×3
algorithm ×1
dma ×1
docker ×1
kernel ×1
pci ×1
powerpc ×1
printk ×1
sysfs ×1
ubuntu-18.04 ×1
ubuntu-20.04 ×1
usbserial ×1