问题标签 [linux-kernel]

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.

0 投票
1 回答
215 浏览

git - 使用 git 保持对移动目标(例如 Linux)的更改

我有一组更改可以完美地针对某个 linux 版本,比如 2.6.25.4。

我有一个 git 树,并从标签 v2.6.25.4 创建了一个跟踪分支 vanilla-2.6.25.4。我由此创建了一个名为 my-changes-2.6.25.4 的分支,并完成了我所有的工作。

现在,我想将我的工作重新建立在任意较新版本的 Linux 之上。说 2.6.28.9。实现这一目标的最佳 git 工作流程是什么?

我知道如何从 2.6.28.9 创建一个新分支,但是执行类似 'git merge my-changes-2.6.25.4' 之类的操作会引起我不感兴趣的其他事情的各种冲突。无论如何,这似乎已经坏了。

我尝试从我的工作 my-changes-2.6.25.4 创建一个新分支,并执行 git rebase 2.6.28.9,假设这会将我的更改从 2.6.25.4 应用到 2.6.28.9 之上,但这给了我很多与我所做的任何更改无关的冲突。

我不确定这样做的正确方法是什么。我正在使用稳定的 linux 树http://www.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6-stable.git,我认为一些问题可能源于事实版本化标签 v2.6.xy 并非都来自同一血统。

有谁知道如何正确地做到这一点?额外的功劳是设计了一种通过二进制搜索尽可能自动前进的方法,以找到 Linux 通过更改接口破坏我的代码的下一个位置,但我想一旦我知道我实际上想要做什么,我可以自己自动化它.

0 投票
2 回答
9871 浏览

linux - 糟糕:坏区域的内核访问,sig:11 - 'swapper' - 终止中断处理程序

在嵌入式 linux 环境中(PowerPC 上的自定义 2.4.25)我在几个小时后得到以下内核恐慌:

猫 /proc/模块:

ksyms -m:

我搜索了帮助,但我找不到有用的东西。A 还想“解码”回溯,但我不明白如何......地址与 System.map 中的地址不对应。谁能解释我如何找出错误?

谢谢,克里斯

0 投票
2 回答
55104 浏览

c - 定义宏时do while(0)有什么用?

可能的重复:
C/C++ 宏中的 Do-While 和 if-else 语句
do { ... } while (0) — 它有什么用?

我正在阅读 linux 内核,发现很多这样的宏:

为什么他们使用它而不是简单地在 {} 中定义它?

0 投票
3 回答
8476 浏览

c - 针对特定场景的最佳 Linux 内核锁定机制是什么

我需要解决这种情况下的锁定问题:

  1. 多CPU系统。
  2. 所有 CPU 都使用公共(软件)资源。
  3. 对资源的只读访问是很常见的。(处理传入的网络数据包)
  4. 写访问的频率要低得多。(几乎只有配置更改)。

目前我使用read_lock_bh, write_lock_bh(自旋锁)机制。问题是 CPU 越多,我在编写器上下文中获得的软锁定就越多。

我读了这本书的并发章节,但不太明白在使用自旋锁时,读者或作者是否会获得优先权。

所以问题是:

  1. Linux自旋锁机制是否优先考虑读取器/写入器/没有它们?
  2. 有没有更好的机制可以用来避免在我的场景中出现这些软锁定,或者在使用我当前的解决方案时,我是否可以在尝试获取锁时优先考虑写入器?

谢谢,尼尔

0 投票
6 回答
6180 浏览

linux - 在内核和用户空间之间进行通信的理想和最快的方式是什么?

我知道信息交换可以通过内核和用户空间程序之间的以下接口进行

  • 系统调用

  • ioctl

  • /proc & /sys

  • 网联

我想知道

  • 如果我错过了任何其他界面?

  • 其中哪一种是交换大量数据的最快方式?(如果有任何文件/邮件/解释支持我可以参考的这种主张)

  • 哪一种是推荐的交流方式?(我认为它的网络链接,但仍然很想听听意见)

0 投票
4 回答
75915 浏览

linux-kernel - Linux 内核如何知道在哪里寻找驱动程序固件?

我正在 Ubuntu 下编译一个自定义内核,我遇到了我的内核似乎不知道在哪里寻找固件的问题。在 Ubuntu 8.04 下,固件与内核版本的绑定方式与驱动程序模块的绑定方式相同。例如,内核 2.6.24-24-generic 将其内核模块存储在:

及其固件:

当我根据“ Alternate Build Method: The Old-Fashioned Debian Way ”编译 2.6.24-24-generic Ubuntu 内核时,我得到了适当的模块目录,我的所有设备都可以工作,除了那些需要固件的设备,比如我的英特尔无线网卡(ipw2200模块)。

例如,内核日志显示,当 ipw2200 尝试加载固件时,控制固件加载的内核子系统无法找到它:

errno-base.h 将其定义为:

(返回 ENOENT 的函数在它前面加上一个减号。)

我尝试在 /lib/firmware 中创建一个符号链接,其中我的内核名称指向 2.6.24-24-generic 目录,但是这导致了同样的错误。该固件是非 GPL,由 Intel 提供并由 Ubuntu 打包。我不相信它与特定的内核版本有任何实际联系。cmp表明各个目录中的版本是相同的。

那么内核如何知道去哪里寻找固件呢?

更新

我找到了解决我遇到的确切问题的方法,但是它不再适用,因为 Ubuntu 已经消除/etc/hotplug.d并且不再将其固件存储在/usr/lib/hotplug/firmware.

更新2

更多的研究发现了更多的答案。在 92 版之前udev,该程序firmware_helper是加载固件的方式。从udev93 开始,这个程序被一个名为 firmware.sh 的脚本取代,据我所知,它提供了相同的功能。这两个都将固件路径硬编码为/lib/firmware. Ubuntu 似乎仍在使用/lib/udev/firmware_helper二进制文件。

固件文件的名称firmware_helper在环境变量$FIRMWARE中传递给连接到路径/lib/firmware并用于加载固件的环境变量。

加载固件的实际请求是由驱动程序(在我的例子中为 ipw2200)通过系统调用发出的:

现在在驱动程序调用request_firmwarefirmware_helper查看$FIRMWARE环境变量之间的某个地方,内核包名称被添加到固件名称之前。

那么谁在做呢?

0 投票
1 回答
751 浏览

linux - 内核中 sk_buff 的数量是否有限制

我需要在我的 NetFilter 挂钩中窃取一些 SKB,并将它们保留一段时间。

内核对我一次可以使用多少个 SKB 有限制吗?在我的内核模块中保存大约 100,000 个甚至更多的 SKB 会有什么后果?如果我可以有很多很多 SKB,我可以避免复制我的数据包两次。

问候, 丹尼斯

0 投票
9 回答
1145 浏览

c - Linux 操作系统类的内容

在即将到来的学期,我将成为操作系统课程的助教。这些实验室将专门处理 Linux 内核。

  1. 你认为 Linux 内核的哪些概念/组件在课堂上最重要?
  2. 你希望在你的学习中被忽略的内容是什么?

任何有关 Linux 内核或整体操作系统设计的建议都将不胜感激。

0 投票
2 回答
1310 浏览

linux - 通过 VMware 交叉编译 Linux 内核和调试

我正在考虑在 vmware VM 下进行一些 Linux 内核和设备驱动程序开发以进行测试(Ubuntu 9.04 作为 vmware server 2.0 下的来宾),同时在 Ubuntu 8.04 主机上进行编译。

我不想承受在 VM 下进行编译的性能损失。

我知道内核显然没有链接到它自身之外的任何东西,所以在这方面不应该有任何问题,但是

  1. 这样做时我需要注意什么特别的问题吗?
  2. 除了在内核崩溃时仍然有一台正在运行的计算机之外,此设置还有其他好处吗?
  3. 是否有使用这种设置的指南?

编辑

我已经看到很多关于在 VMware 中通过 Workstation 6.0 在主机上使用 GDB 进行远程调试的参考资料。有谁知道这是否适用于任何免费版本的 VMWare,例如 Server 2.0。

0 投票
5 回答
147384 浏览

linux - 选择 Linux I/O 调度程序

我读到可以通过写入 /sys/block/[disk]/queue/scheduler 来更改正在运行的内核上特定设备的 I/O 调度程序。例如,我可以在我的系统上看到:

默认是完全公平的排队调度程序。我想知道在我的自定义内核中包含所有四个调度程序是否有任何用处。除非内核足够聪明,可以为正确的硬件选择正确的调度程序,特别是用于基于闪存的驱动器的“noop”调度程序以及用于传统驱动器的其他调度程序,否则编译多个调度程序似乎没有多大意义硬盘。

是这样吗?