linux-device-driver相关内容

如果使用阶数大于1的__GET_FREE_PAGES(),如何创建VM_Area映射?

我正在DMA的设备驱动程序中重新实现mmap。 我看到这个问题:Linux Driver: mmap() kernel buffer to userspace without using nopage有一个答案,使用vm_insert_page()一次映射一个页面;因此,对于多个页面,需要在循环中执行。是否有其他API处理此问题? 之前,我使用dma_alloc_coherent为DM ..
发布时间:2022-08-10 09:35:56 服务器开发

Linux驱动程序:不使用nopage将mmap()内核缓冲区映射到用户空间

我正在为一个数据采集设备实现一个Linux设备驱动程序,它不断地将数据流入我在内核中分配的循环缓冲区(使用__get_free_pages())。循环缓冲区(由PCIe硬件写入)驻留在RAM中,我希望用户空间能够mmap()该RAM区域,以便用户空间可以读取其内容。 根据LDD3: remap_pfn_range的一个有趣的限制是,它只允许访问保留的页和物理内存顶部以上的物理地址。 . ..
发布时间:2022-08-10 09:29:15 服务器开发

是否在保留mmap_sem的情况下调用mmap回调?

当我们到达Linux内核模块中一个struct file_operations的mmap的回调时,我们可以假设在调用回调之前vma->vm_mm->mm_sem已经被挂起了吗? 还是必须在执行remap_pfn_range之前显式调用down_write(&vma->vm_mm->mmap_sem)? 推荐答案 mmap文件操作处理程序应假定mmap锁在被调用时已被写锁定。mmap文件 ..
发布时间:2022-04-05 09:26:05 其他开发

内核逻辑地址空间、内核虚拟地址空间和用户虚拟地址空间有什么不同

让我把我的理解。 假设我们有一个系统的32位内存地址空间。因此进程可以访问4 GB范围内的任何内存 如果我们系统中的RAM为4 GB,则内核将其分为1:3。1 GB用于内核,其余3 GB用于用户空间进程。 用户空间进程只能访问该3 GB内存中的系统内存,并且它获得的地址由页表确定。 内核逻辑地址是仅为内核保留的1 GB(大约896MB)内存。这样做正确吗? 内核虚拟地 ..

Linux-不同于安装的内核版本的标头

如何获取与系统上安装的内核版本不同的Linux-Header?(Debian)我搜索了整个Web,除了可以下载当前运行的内核的Header之外,我找不到其他任何东西,为什么获取未运行的内核的Header就这么难? 我需要4.16标头来编译LKM,但我在4.9上运行。 推荐答案 您可以从以下位置获取任何标准版本的内核头和源代码: Git克隆https://github.com ..
发布时间:2022-04-05 09:21:43 其他开发

将多个内核缓冲区映射到连续的用户空间缓冲区?

我使用dma_alloc_coherent分配了多个内核可访问的缓冲区,每个缓冲区的大小都是4MiB。目标是将这些缓冲区映射到一个连续的用户空间虚拟内存。问题是remap_pfn_range似乎不起作用,因为用户空间内存有时工作,有时不工作,或者有时复制缓冲区的页面映射。 // in probe() function dma_alloc_coherent(&pcie->dev, BUF_ ..
发布时间:2022-04-05 09:15:48 服务器开发

如何区分内核中的软锁定和用户空间中的软锁定?

我有下面的禁闭室。这是否表明SLEC_TEST PID5207是攻击者,或者只是因为内核中的当前宏仍然指向使系统调用我的驱动程序的用户空间进程?此外-IRQ事件戳0...IRQ事件戳到底代表什么?这不可能是自启动以来的中断次数...88798秒后肯定超过了0... 系统是单处理器,已禁用CONFIG_SMP。 [88798.449628] BUG: soft lockup - CPU# ..
发布时间:2022-04-05 09:13:21 服务器开发

在不从用户空间提供寄存器地址的情况下读取字(2字节)

我正在尝试从用户空间中的C读出i2c环境光传感器BH1750。我在Linux上使用Beaglebone口袋。 数据表说明,在测量操作之后,需要使用以下i2c序列读取结果:S Adr Rd (A) (Data) A (Data) NA P。 我遇到的问题:我发现的所有示例/命令要么只能读取1个字节,要么需要寄存器地址才能读取更多字节。 我找到的最接近的命令是:i2c_master_ ..
发布时间:2022-04-05 09:11:31 其他开发

Linux中的ioctl()是否可以为NVMe IO请求指定提交队列ID

我正在开发一个nvme-cli的测试工具(用c编写,可以在Linux上运行)。 出于SSD验证的目的,我们实际上正在寻找将I/O命令发送到特定的提交队列(IO队列对)。我们需要它,因为我们想要线程化,但要实现线程化,我们需要将I/O请求发送到不同的队列,否则I/O请求将被连续处理。 那么在ioctl()中有什么方法可以指定提交队列ID吗? 以下是使用ioctl() 请求NVMe ..

如何从Linux内核空间向用户空间发送信号以通知输入硬件事件

我的内核模块代码需要向用户域程序发送信号,以便将其执行转移到注册的信号处理程序。 事实上,我已经为我的嵌入式板卡开发了一个C程序,当我按下按钮(输入事件)时,LED会亮起和熄灭。另一方面,我刚刚开发了一个简单的Linux模块,包括它的基本功能(打开、关闭、读、写)。 我只是不知道如何修改我的主程序和内核模块以达到我的目标。 我与您分享我的用户空间计划: #include ..

Dev_set_drvdata和dev_get_drvdata的可能用途是什么

我只是想知道当我们必须使用这些Set和Get驱动程序API时,可能的用例是什么。 我所知道的就是数据被保存了,以后我们可以使用数据来做一些事情。我的问题是,我们什么时候真的需要这样做? /* * These exports can't be _GPL due to .h files using this within them, and it * might ..
发布时间:2022-04-05 09:03:31 其他开发

这个泛型函数有什么作用?

static inline __printf(2, 3) int dev_err(const struct device *dev, const char *fmt, ...) { return 0; } __printf()正在做什么,第三个参数(...)开发错误意味着什么? 我可以想象这个函数是某种泛型函数。它能做什么? 推荐答案 除__printf(2,3)外,几乎所有内容都 ..
发布时间:2022-04-05 09:00:58 其他开发

班级和班级装置的用途是什么?

我遵循了一些教程,这些教程解释了如何编写Linux内核模块,我有点困惑。即使看了official "documentation",我对概念的理解也很差。 创建字符设备(register_chrdev)后,我发现使用以下功能组合是很常见的: class_create class_device_create device_create 我不能理解,什么是类、设备和类、设备 ..

如何解决内核配置无效问题

我正在尝试生成模块。 但这里有一些问题。 错误:内核配置无效。 缺少INCLUDE/GENERATED/Autocon.h或INCLUDE/CONFIG/Auto.conf。 在内核src上运行‘make oldconfig&;&;make prepare’以修复它。 警告:符号版本转储。/Module.symver 缺少;模块将没有依赖项和modversions.` ..
发布时间:2022-04-04 23:56:44 其他开发

在内核模块中发送 UDP 数据包

背景:我是 UCSB 计算机工程专业的四年级学生.我参加了网络和操作系统课程.我在用户空间中创建了一个程序,它将 UDP 数据包广播到子网并在自组织网络中接收 UDP 数据包.我想要完成的是将这个程序转换为一个内核模块,该模块将在带有 Angstrom Linux 的 ARM 嵌入式系统上运行,内核版本 2.6.39(x86 到 ARM 架构的交叉编译是另一天的问题).迁移到内核的原因是为了摆脱用 ..
发布时间:2022-01-19 16:31:34 其他开发