问题标签 [userspace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-device-driver - 如何为 DPDK 应用程序更改 NIC 的批量大小?
我在运行Ubuntu 16.04的基于Xeon(R) CPU E5-2640 v3的服务器上使用英特尔 2P X520 适配器。当我们在 NIC 和应用程序中更改批处理因子时,我有兴趣测量应用程序的性能(吞吐量)。通过更改应用程序中的批量大小,我们可以获得更高的吞吐量,直到 PCIe 开始成为瓶颈。
我不确定如何更改 NIC 的批处理大小。代码中需要更改哪些内容以更改 NIC 的批处理大小以及 DPDK(版本 16.07)中 x520 NIC 的默认批处理大小是多少?
PS:对于某些应用程序而言,较大的批处理大小是一个问题,因为每个数据包的延迟相对于批处理大小会增加。我只对吞吐量感兴趣,而不是每个数据包的延迟。
linux - 如何将简单消息从内核发送到用户空间?
我有一个非常简单(我认为)的问题。我有一个非常简单的内核模块,它处理来自我的硬件的中断(它都在我的设备树中描述)。我得到内核中的中断。现在我想向uint32_t
用户空间中的程序发送一条消息(仅 64 位,两个)。如果我可以“唤醒”我的程序也可以(那里有多个线程,所以一个线程可以休眠直到它被内核模块唤醒)。
我的问题是:最简单和最清晰的解决方案是什么?我使用 proc 文件系统阅读了有关 netlink 的信息,但是
- 要么我找不到一些明确的例子
- 消息仅从用户到内核空间
- 对于我使用的内核(4.4),示例已经过时。
有没有人有一个非常清楚的例子或如何做这样的事情?
PS我不想处理内核空间中断之后的所有事情。如果某些消息丢失了也没关系。
linux - 如何在 Linux 用户空间中创建高频日志记录(跟踪)?
我正在启动一个新的用户空间应用程序,我想创建一些用于日志记录和跟踪的常用实用程序
我区分这两个实用程序。在我看来,日志记录应该是始终开启并用于高级信息和调试的东西。追踪更加详细和频繁。
我认为 syslog 是日志记录工具的一个很好的候选者,但我不知道跟踪。我认为使用 syslog 进行跟踪不是一个好的选择
我认为应该有一些机制可以在 linux 用户空间中进行跟踪。我的意思是一些允许我创建这样的跟踪的设施:“, , , 发送了 1200 个数据包进行处理”
我正在考虑使用 uprobes,但我不知道它是否允许我添加自己的自定义跟踪消息,或者它只是告诉我何时调用了哪些函数
linux - 有没有办法可以使用 netlink 在两个用户空间进程之间进行进程间通信(IPC)?
我是 Linux 的新手。我有两个用户空间进程,A 和 B,B 必须从 A 接收消息,进行一些处理,并在完成后确认。所以我正在研究一种双向消息传递协议,并且看到 netlink 被用于用户和内核空间之间的通信。有没有办法使用 netlink 进行两个用户空间进程通信?
如果这不是一个理想的解决方案,还有其他方法可以实现吗?我正在查看消息队列,但它们似乎是单向通信机制。
timer - 用户空间中的hrtimer信号处理程序?
作为我的研究小组的一部分,我为正在建造的卫星设置了多个 hrtimer。理想情况下,我希望在用户空间中访问这些计时器,所以我想知道是否有办法让 hrtimer 生成可以在用户空间中处理的信号。那可能吗?
c++ - 跨平台(mac/win)方式将uboot写入sd卡上的特定位置
我正在使用跨平台(mac/windows)更新程序工具将 uboot SPL 写入 SD 卡上的特定位置。
我基本上想从我的用户空间 C++ 应用程序中执行与此 linux 命令等效的操作:
其中“out”是 uboot SPL 和 dtb 的串联。
问题:
- 有没有办法从 Mac OSX 和 Windows 上的用户空间做到这一点?
- 是否有一个开源跨平台库可以将二进制文件写入磁盘(sd 卡)上的特定位置而不需要内核驱动程序?
我用谷歌搜索,但找不到任何工具包或库可以做到这一点。
linux - 如何在 linux 用户空间中创建 *.a 到 *.so?
我完成了编译文件 makefile.am 并且我需要我的 lib 的共享链接,例如在编译后我看到/usr/lib64/libtest.a
但我需要libtest.so
因为我需要我的 lib 到其他 C 源文件,
例子 :g++ -llibtest test.c
我在这里读到了这个,但我不确定如何工作以及如何使用,ranlib
或者ar
,有什么方法可以创建 *.a 到 *.so?
linux-kernel - free():仅在零拷贝 DMA 驱动程序访问后指针无效
我有一个驱动程序将 DMA 传输到在用户空间应用程序中分配的内存,然后传递给内核(get_user_pages ...)。
问题:调用 free() 时收到“无效指针”消息。我打印两个指针值,它们是相等的,没有改变。当我使用 posix_memalign() 而不是 malloc() 时,该错误不会发生。在 posix_memalign() 的情况下,我总是得到页面对齐的指针(0x....000)。使用 malloc() 它通常是未对齐的地址。
我已经尝试完全跳过驱动程序 DMA 传输调用,基本上只是在应用程序中执行 malloc() 和 free() - 然后它总是有效!
这告诉我,内核似乎以某种方式认为页面仍然在内核空间中“锁定”左右。
我已经挖掘了一些驱动程序,特别是驱动程序/媒体/pci/ivtv/ivtv-udma.c 和 ivtv-yuv.c 看起来很有趣,因为它们看起来完全一样。
在那里我找到了我已经在我的驱动程序中尝试过的函数“put_page”,但它没有帮助,而且驱动程序然后卡住了。
有人可以指出我正确的方向或信息来源,如何正确处理内核空间中的此类用户页面?
这里是相关代码。顺序基本上是:get_user_pages -> dma_map_page -> kick off HW DMA (in our FPGA) -> dma_unmap_page -> SetPageDirty -> put_page
但是对于未对齐的地址,仍然会发生与以下相同的错误。
usimg malloc 缓冲区(未对齐内存)时的错误消息:
linux - linux系统调用使用自旋锁将值返回给用户空间
我目前正在努力正确实现内核自旋锁以及返回语句,该语句应该返回一个值给用户空间。我实现了一个内核系统调用“sys_kernel_entropy_is_recording”,它应该返回一个内核变量“is_kernel_entropy_recording”的值:
此时出现两个问题:
Q1:这个实现是否正确,意味着'is_kernel_entropy_recording'的正确值会返回到用户空间,然后释放自旋锁?
我的担忧是:
- a) 是否允许以这种方式将值从内核空间返回到用户空间?
- b) return 语句位于spin_unlock 语句之前,因此 spin_unlock 会被调用吗?
Q2:为了自己回答这些问题,我反汇编了编译的 .o 文件,但确定(至少它看起来像)编译器完全忽略了 spin_lock/spin_unlock 调用,因为它只是将 'sys_kernel_entropy_is_recording' 的值移动到 eax调用ret(我不确定'callq 0xa5'行):
因此,我猜自旋锁的应用是不正确的。有人可以给我一个适当方法的建议吗?提前非常感谢!
c - 在用户空间程序/ SPI 应用程序中包含驱动程序
现在我正在寻找使用 Cadence SPI 驱动程序在 Linux 上执行一些基本的读写操作。我刚刚使用了 I2C 驱动程序,但对于所有这些驱动程序如何组合在一起以及是否存在它们都符合的通用接口,我仍然有些困惑。
这是我为使用 I2C 驱动程序而编写的代码
我对实际调用驱动程序的位置感到困惑。现在我在这里阅读 SPI 驱动程序文档:
https://www.kernel.org/doc/html/v4.11/driver-api/spi.html
I2C 驱动程序的相应文档在这里:
https://www.kernel.org/doc/html/v4.11/driver-api/i2c.html
I2C 文档中定义的第一个结构是 i2c_driver。我不认为我在编写 I2C 程序时使用了 I2C 驱动程序文档中定义的任何结构。我真的使用过 I2C Cadence 驱动程序吗?如果没有,如何重写我的程序以使用 I2C Cadence 驱动程序,这样我就可以了解如何在用户空间中使用驱动程序,从而可以使用 SPI 驱动程序。