问题标签 [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.
operating-system - 创建更多特权环
据我了解,大多数操作系统中有两个特权环:内核模式和用户模式。操作系统开发人员能否创建额外的特权环,例如中间件模式或内核模块模式?
linux - 是否可以从用户空间添加平台数据?
我正在尝试在 Linux 中启用平台设备,但我尝试使用的设备没有任何平台数据。是否可以从用户空间添加它?
我的其他想法:
我是否必须将此平台数据编译到内核中?如果是这样我可以把它放在一个可加载的模块中吗?我可以使用udev吗?我是否必须将其放入设备树中(我使用的是似乎不支持设备树的 Allwinner SoC)?
linux - 是否有一个 linux 内核模块来执行连续的物理内存分配?
我读过这个。
但我正在使用 PCI UIO,因此我需要连续的物理内存。我说的是(除其他外)virtio,所以 IOMMU 的存在在这里无济于事。我同意 PCI-VFIO 有更好和更安全的方法,但据我了解,IOMMU 虚拟化技术并不成熟。
在客户机上运行的用户空间中编写 PCI-UIO virtio 驱动程序需要物理连续内存。另外,并不是所有的HW都有IOMMU,所以即使是这么简单的hosts系统,也不能使用VFIO,需要连续的物理内存……
因此,简而言之,只要 IOMMU 不是无处不在,并且没有在虚拟器上正确模拟,似乎就需要从用户空间分配连续的物理内存。
我知道用户可以从/proc/<pid>/
... 读取页面映射,并且允许 dpdk 正在使用的尝试和错误方法...
但是感觉连续的物理内存分配通常应该是内核模块的工作......而且我不能成为第一个面临这种情况的人......
这样的内核模块存在吗?
c - 使用 libfuse 的 fuse 文件系统稳定增加内存
我在我的 fuse 文件系统实现上运行用于 fileio 的 dbench 基准测试工具,并且我确保该 fuse 可以维持测试。
我正在使用 libfuse 库(https://github.com/libfuse/libfuse)来实现 fuse。我没有做任何花哨的事情,我只是让它通过,读取只是做 pread,写只是做 pwrite。
我让它运行了大约 10 个小时,我看到内存从 0 稳定增加到 21G。有没有其他人看过这个?我检查了代码中的内存泄漏,但我正在做非常简单的直通代码,我没有专门分配堆内存。就像一个简单的读取函数看起来像这样。FUSE_DATA 是在主函数中分配的全局结构。
}
我在 fuse 上尝试了 valgrind,它的报告在 libgobject 库中给了我很多这样的信息。
operating-system - 为什么操作系统(全新安装)的大小在增加?
好的,这只是一个简单的问题,但我真的很想从创建发行版(linux)的人那里得到一些答案,或者是否还有人参与 OsX 或 Windows。
安装后的大小似乎在增加,Windows 10 需要 20GB 的磁盘空间(64 位)。我想内核不是问题,所以问题出在应用程序(即用户空间)。但是我看不到操作系统打包的应用程序数量增加了,至少没有大的增加,所以问题是......他们是如何编写它们的,运行时支持等。
有人可以对此发表评论吗?
c - msghdr behavior using Netlink to communicate between kernel space and user space
I'm currently working on a linux kernel module for a school project, that involves exposing the kernels hashtable implementation to user space.
To achieve this, I've also created an user space API that communicates with the LKM via a Netlink socket.
I do have it working now, but I ran into a bump that left me quite confused and I really can't wrap my head around. And after reading through all documentation, which really didn't help my understanding of the problem, and "going down the rabbit hole" and looking through the source code for Netlink, I figured I'd ask the question here to see if anyone might know what, and why, this is happening.
So, to isolate the problem, I created a small test program that runs the generic Netlink user-space and kernel-space communication example. Through this I will show 3 small variations of the user space program, which all have different behavior, and it is THAT behavior I am wondering about.
So first is the kernel module, which will be the same for all 3 variations:
And then the user-space program:
Now If i run this, all is fine and well and it gives me the console output:
and the kernel log output from dmesg:
But for this project, we are using multi threaded applications calling the API, so I wanted to try and give each calling thread an own Netlink socket. To do that I had to make
into a locally declared variable.
Problems arise
When I moved it into the main function things instantly broke. This in the way that the kernel doesn't even enter the Netlink callback function, so I guess the user space program fails to even write to it, but it still returns the correct amount of written bytes from the sendmsg() function.
This is what's output to console when having the msghdr locally declared:
And then it hangs, and needs to be SIGINT'ed, and the kernel log doesn't show anything about the LKM receiving any data.
So I started wondering if it could be an addressing error happening when it was locally declared, so to try it out I converted the msghdr into a dynamically allocated pointer in the local scope, and you know what, it worked! It gave the same console and kernel log output as the original example.
Soooo, my actual question is really one for educational purpose and to understand why it is behaving in this way.
Why does a globally declared variable work, where a locally declared one does not?
And furthermore, why does a locally declared, dynamically allocated, pointer work?
Am I missing something on a fundamental level here?
TL;DR:
Why does it not work to have the msghdr struct locally declared in the user space program, while a globally declared or a local dynamic pointer does?
linux - 从 linux 用户空间切换多个 GPIOS
我正在通过嵌入式 linux 编写应用程序。我有两个 LED,我可以使用两个不同的 GPIO 引脚打开和关闭它们。
我想通过同时设置两个 GPIO 引脚来同步它们。这是可行的,因为 GPIO HW 有一个用于输出值的寄存器,并且每一位代表一个引脚。
但是我没有设法找到一种方法来绕过内核驱动程序并写入该寄存器。这不是一种健康的方法,我想使用用户空间 API 来做同样的事情。
有没有办法导出一些引脚并以某种方式“绑定”它们?
linux - 什么时候会选择在内核空间而不是用户空间编写软件?
假设您有一个运行嵌入式 linux 的嵌入式设备(例如树莓派)并希望与外部模块通信。
在哪些情况下,您会决定通过编写内核空间驱动程序与设备进行通信?
在哪些情况下,您会通过在用户空间中编写软件来简单地与设备进行通信?
linux - 来自用户空间 Linux 的 IRQ 处理
我正在为 FPGA 中的合成设备编写驱动程序。该设备有几个 IRQ,并已在我的驱动程序上请求它们:
我的问题是我希望 irq_handler 调用用户空间应用程序的函数。有什么方法可以从内核空间驱动程序的 irq_handler 调用我的用户空间应用程序?
我知道我可以从驱动程序中保存一个标志并将其方向从用户应用程序映射到轮询它,但我想知道是否有更快/更正确的方法。
先感谢您
c - 如何在内核程序中使用 copy_to_user()?
我尝试copy_to_user()
在循环内使用。
但是,我得到的输出是不同的。它只有用户空间中的最后一行数据,例如
如何将每一行从内核空间复制到用户空间?