我的新内核已CONFIG_DEVTMPFS启用,因此我的内核/dev已安装为devtmpfs. 我的旧内核没有使用CONFIG_DEVTMPFS,/dev 曾经以普通方式安装tmpfs。
现在我注意到,它的大小/dev/大得离谱:8GB,这是我 RAM 的一半:
df | grep devtmpfs
devtmpfs devtmpfs 7.8G 0 7.8G 0% /dev
Run Code Online (Sandbox Code Playgroud)
以前,当我/dev挂载为 时tmpfs,大小曾经是10MB
df | grep tmpfs
tmpfs tmpfs 10M 0 10M 0% /dev
Run Code Online (Sandbox Code Playgroud)
在我看来,10MB 对于/dev. 为什么/dev/默认分配 50% 的 RAM?我可以在哪里更改此设置?
我遇到了系统冻结问题,我在 github 上找到了这个讨论,其中之一建议添加 5 个补丁:
当我输入:
patch p1 < 0001-PM-autocomplet.patch
Run Code Online (Sandbox Code Playgroud)
这是我当前的设置:
vm.overcommit_ratio = 50 (default)
vm.overcommit_memory = 2
Run Code Online (Sandbox Code Playgroud)
和当前内存使用情况:
[localhost~]$ free -g
total used free shared buffers cached
Mem: 47 46 0 0 0 45
-/+ buffers/cache: 1 45
Swap: 47 0 47
Run Code Online (Sandbox Code Playgroud)
根据文档我的理解是:
vm.overcommit_memory = 2不允许过度使用内存超过 RAM 的 50% (as vm.overcommit_ratio is 50),但我仍然可以看到当前内存使用量为 47 GB 中的 46 GB。
我是不是误会了什么?
但请记住,“禁用 irqs” 是一种根本上不安全的禁用抢占的方式 - 任何将抢占计数减少到 0 的 spin_unlock() 都可能会触发重新调度。一个简单的 printk() 可能会触发重新安排。
如果 IRQ 被禁用,那么该 CPU 内核上的定时器中断也应该被禁用。自然,它应该依次禁用调度程序(抢占)。为什么调用 irqsdisabled() 来禁用抢占是不安全的方法?
此外, printk() 如何触发重新安排?
我想将用于签署内核模块的密钥对中的公钥添加到 system_keyring 中。然而,有一个问题:
通过命令cat /proc/keys | grep system_keyring,我得到了system_keyring的条目(ID)。但是,当尝试使用以下命令添加我的公钥时:keyctl padd asymmetric "" 0xXXXXXXXX</test/signing_key.x509,我收到“权限被拒绝”错误。
我认为这是由于“module_signing.txt”中描述的限制https://01.org/linuxgraphics/gfx-docs/drm/admin-guide/module-signing.html:
但请注意,如果新密钥的 X.509 包装器由添加密钥时已驻留在 .system_keyring 中的密钥有效签名,则内核将仅允许将密钥添加到 .system_keyring 中。
但是,我找不到任何文档来描述如何使用已驻留在 .system_keyring 中的密钥对“X.509 包装器”进行签名。
另外,我认为该密钥环中的密钥只是公钥。因此,即使我可以从密钥环中提取公钥并使用该公钥签署“X.509 包装器”,我什至认为它不会起作用。
无论如何,这里需要一些帮助。或者,即使有东西可以给我一个提示,告诉我如何将我的内核模块提交到 RedHat,以便它可以由 RedHat 签名并安装在用户的安装上,而无需重建内核?
这是我上一个问题的后续问题。
根据答案,系统调用是我们跳转到进程虚拟内存的内核部分的一个示例。
除了系统调用之外,正常进程(非内核)使用这部分虚拟内存的其他示例还有哪些?就像有没有任何函数调用可以直接跳转到这个内核部分或者..?
当我们跳转到这部分内存时,处理器是否会自动将内核模式位设置为1以便我们的进程访问这部分内存,或者不需要设置该位?
该内核部分内部的所有执行是否都不需要上下文切换到内核进程?
(我不想在评论中提出这些后续问题,所以我打开了另一个线程。)
我们目前正在致力于构建一个针对不同传感器的数据可视化系统。
为了使 Linux 应用程序的开发成为可能,我们需要模拟不同字符设备的行为,因为设备驱动程序和硬件设计尚未完成。
那么有没有一种方法可以接收对某个特定文件的系统调用(例如,也从用户空间运行的 C 程序)?
read()
(Userspace Application/Database) <========= (~/mydev) <===== (dummy_driver)
Run Code Online (Sandbox Code Playgroud) 今天更新了我的 Lenovo Thinkpad X1 Carbon(第 6 代)上的软件包。我没想到会发生什么,但它确实发生了。F1 和 F4 键上的静音 LED 指示灯停止工作。
我实际上知道这个问题很快就会得到解决。我只是提出一个问题,以便我可以回答它,以防其他人正在寻找解决方案。
我可以看到我的initrd文件占用了近 90 MB 的磁盘空间,但通过解压后cpio,它只包含一个 30 KB 的微代码:
$ cpio -it < initrd.img-5.4.0-18-generic
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/AuthenticAMD.bin
62 blocks
Run Code Online (Sandbox Code Playgroud)
我知道内核在启动的第一阶段需要很多文件和工具,但我找不到任何有用的东西。
$ file initrd.img-5.4.0-18-generic
initrd.img-5.4.0-18-generic: ASCII cpio archive (SVR4 with no CRC)
Run Code Online (Sandbox Code Playgroud)
我查看了这里和这里以及这个问题,但这些太旧了,对我不起作用。我的initrd.img不是gzip档案。
如何正确提取该文件?
我使用内核 v.5.4.0
谢谢。
我花了几个小时甚至几天的时间来弄清楚如何为 AArch64 交叉编译 Linux。
我在虚拟机中使用 Ubuntu 来执行此操作,但是我找到的所有指南都不能完全正常工作。他们中的大多数人假设最终用户拥有 Debian,并且那里的名称有所不同。一旦我能够获得要制作的配置文件,但我无法使用它。当我输入 时make,我收到了一份针对基于 x86 的系统的调查问卷,尽管我已经使用 menuconfig 保存了配置文件。然后我指定了ARCH和CROSS_COMPILE参数,然后我得到了另一份调查问卷,跳过了很多对我的构建目标至关重要的事情。
然后我的 Ubuntu VM 需要重新安装,所以我几乎回到了零,不知道我需要安装什么才能让交叉编译工作,也不知道我如何指定参数CROSS_COMPILE。我已经安装了编译器(花了几个小时才弄清楚它在 Ubuntu 下是如何调用的),但是当需要指定交叉编译时它有不同的名称。也许我跳过了一些东西。
是的,我已经多次用谷歌搜索过它,大多数指南都假设用户知道很多相当晦涩的东西。他们中的许多人甚至已经十多岁了。