标签 内核 下的文章

新的内核开发周期开始了

首个内核候选版本在3.19分支上发布了,它看上去像目前最大的一个 RC1。Linus Torvalds很惊奇这么多人提交了,其实不过也很好理解。

内核开发周期因新的3.19的发布而刷新了。事实是3.18分支才几周前才发布,今天的发布并不是完全在预期中。假期要来了,很多开发者和维护人员可能会休息。一般来说RC版本每周发布一次,但是用户可能会看到一点的延误。

这个版本没有提到在Linux 3.18中确认的回归问题,但是可以确定的是,开发人员仍在努力修复中。另一方面,Linus说这是一个很大的更新,事实上这是目前为止最大的更新。很有可能是许多开发者想要在节日之前推送他们的补丁,因此,下一个RC版本会小一些。

Linux 3.19 RC1 标志着新的一个周期的开始

发布版本的大小随着更新的频率正在增加。内核的开发周期通常大约8到10周,并且很少多于这个,这给项目一个很好的预测。

阅读 Linus Torvalds的发布声明中说:“也就是说,也许没有谁在拖后腿,并且从rc1的大小来看,真的也不能再多了。我不仅觉得下一个版本会有更多的提交,并且这是历史上最大的一个rc1(在提交数量上)。我们有比它大的版本(3.10和3.15的都是由很大的合并窗口产生的),但是这明显这个合并窗口也不小。”

“按照蓝图,这看上去只是一个常规发布。大约三分之二的驱动更新,这剩下的一半是架构的更新(新的nios2补丁还没有优势,它只有ARM一半的性能,新的niso2支持小于整体架构更新的10%)。”

具体关于这个RC的细节可以在官方邮件列表中找到。

下载 Linux 3.19 RC1 源码包:

如果你想要测试,需要自己编译。并不建议在生产机器上测试。


via: http://news.softpedia.com/news/Linus-Torvalds-Launches-Linux-kernel-3-19-RC1-One-of-the-Biggest-So-Far-468043.shtml

作者:Silviu Stahie 译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

新的一月意味着新的稳定版Linux内核的发布,前一段时间,Linus Torvalds宣布Linux 3.18 很快就会发布了

Torvalds在Linux内核邮件列表中解释到,由于在3.17中还存在几个令一小部分用户烦心的问题,但是‘绝不可以在一些人积极解决老问题时其他人无所事事。

Linux 3.18中有什么新的?

Linux 3.18内核主要致力于硬件支持、电源效率、bug修复和可靠性。

如往常一样,这些内容跨度很大,容易让人迷惑 。比如:加密层多重缓冲操作 - 到气冲感知, 就像对雷蛇游戏手柄的支持。

下面我们收集了这个版本的重要的改变。这远远不是所有的,只是选取了一些更相关的内容。

  • Nouveau (开源的 Nvidia GPU 驱动) 现在支持基础 DisplayPort 音频
  • 对雷蛇游戏手柄的支持,用在Xbox 360上
  • Xilinx USB2 外设
  • 对Microchip AR1021 i2c、PenMount 6000 touch的触摸屏支持
  • 音频编码: Cirrus Logic CS35L32、 Everest ES8328 和 Freescale ES8328
  • 音频支持: 通用飞思卡尔声卡, Analog Devices SSM4567音频放大器
  • 几个文件系统提升, 包括 Btrfs 和 F2FS
  • 现在支持了DCTCP拥塞控制算法
  • JIT 编译64位 eBPF程序
  • “Tinification” 帮助开发人员编译更精简更小的内核

在Ubuntu上安装 Linux 3.18

虽然声称是稳定版并带来了大量的更新,但不要马上急着升级你的系统。除非你擅长处理监控异常,CPU过热、和其他各种系统报出的异常。

如果你坚持更新,你可以在kernel.org网站上找到源码包。

这里有一个由Canonical维护的最新Linux内核归档。尽管你可能在其他地方看到过,但是,请注意,这不是针对终端用户的。没有任何保证与支持,你自己承担风险。


via: http://www.omgubuntu.co.uk/2014/12/linux-kernel-3-18-released-whats-new

作者:Joey-Elijah Sneddon 译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linus Torvalds已经发布了最新的稳定版内核3.17。

Torvalds以他典型的放任式的口吻在Linux内核邮件列表中解释说:

“过去的一周很平静,我对3.17的如期发布没有疑虑(相对于乐观的“我应该早一周发布么”的计划而言)。”

由于假期,Linux说他还没有开始合并3.18的改变:

“我马上要去旅行了- 在我期盼早点发布的时候我希望避免一些事情。这意味着在3.17发布后,我不会在下周非常活跃地合并新的东西,并且下下周是LinuxCon EU”

Linux 3.17有哪些新的?

最新版本的 Linux 3.17 加入了最新的改进,硬件支持,修复等等。范围从不明觉厉的 - 比如:memfd 和 文件密封补丁 - 到大多数人感兴趣的,比如最新硬件的支持。

下面是这次发布的一些亮点的列表,但它们并不详尽:

  • Microsoft Xbox One 控制器支持 (没有震动反馈)
  • 额外的Sony SIXAXIS支持改进
  • 东芝 “主动防护感应器” 支持
  • 新的包括Rockchip RK3288和AllWinner A23 SoC的ARM芯片支持
  • 安全计算设备上的“跨线程过滤设置”
  • 基于Broadcom BCM7XXX板卡的支持(用在不同的机顶盒上)
  • 增强的AMD Radeon R9 290支持
  • Nouveau 驱动改进,包括Kepler GPU修复
  • 包含Intel Broadwell超级本上的Wildcatpoint Audio DSP音频支持

在Ubuntu上安装 Linux 3.17

虽然被列为稳定版,但是目前对于大多数人而言只有很少的功能需要我们“现在去安装”。

但是如果你很耐心——更重要的是——有足够的技能去处理从中导致的问题,你可以通过在由Canonical维护的主线内核存档中找到一系列合适的包安装在你的Ubuntu 14.10中,升级到Linux 3.17。

警告:除非你知道你正在做什么,不要尝试从下面的链接中安装任何东西。


via: http://www.omgubuntu.co.uk/2014/10/linux-kernel-3-17-whats-new-improved

作者:Joey-Elijah Sneddon 译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

偶尔总会有人指出Linux中的POSIX违规(violation),通常的回答是“修复违规问题”,但有时李纳斯·托瓦兹认为POSIX特性是不完整的,至少他们维护Linux特性的情形下是这样的。因此,他们或许应该构建一层POSIX兼容层,即便这个分层会相对较慢和低效。

这一次,迈克尔·凯利斯克(Michael Kerrisk)报告了一个影响文件操作的POSIX违规。显然,在多线程操作期间读写文件会导致竞争出现,重写其它操作的改变。

关于这是否是POSIX的一个违规存在一些讨论,但到最后又有谁关心呢?数据重写(clobbering)是很糟糕的事情。在迈克尔提交部分代码去重现这个问题后,讨论的问题集中到该做什么去修复它。但迈克尔的观点是:“Linux从早期开始就与UNIX不一致。(如在1992年版的史蒂夫的APUE的191页讨论到fork()操作后在父进程与子进程之间文件偏移量的共享问题。尽管史蒂夫没有显式地讲清楚一致性的保证,但缺乏这个保证的推论这里的讨论可能有些没意义。)”

艾尔·维洛(Al Viro)和李纳斯一起设法解决这个修复。李纳斯尝试引入一个简单的互斥量去锁住文件,以便写操作无法互相重写。艾尔提出了自己的改进以改善李纳斯的补丁。

李纳斯一度解释过这个故障自身的历史。显然,从前这个用来告诉系统去哪里写文件的文件指针已经被锁在一个信号量中,所以只有一个进程可以在某一时刻对这个文件做任何操作。但是,他们从中拿走了这个信号量,以便在任何时候可以适应设备文件和其它非常规文件,因为当用户被禁止写入其中时它们就会陷入竞争状态。

这就是错误的由来。那个时候,它悄悄地通过了检查,未被发现。因为实际上对常规文件的读写仍然由内核自动处理。只有文件指针自身可以避免同步。而且,因为高速线程化的文件操作是一个非常罕见的需求,所以对任何人来说都需要很长时间才能遇到这个问题并报告它。

一个有趣的小细节是当李纳斯和艾尔在寻找一个修复方案时,艾尔一度抱怨李纳斯采用的方法并不能支持一些确定的架构,包括ARMPowerPC。李纳斯的回应是“我怀疑关心这个是否有意义。[...]如果使用ARM/PPC架构的人停止抱怨,他们可以往gcc中加入struct-return的支持。”

看到这些问题突然产生并得到处理通常是很有趣的。在某些情况下,这个修复的部分工作必须在内核中进行,部分在GCC中,部分在其它地方。在这个特例里,艾尔认为整个事情都应该在内核里处理,他在灵感的激发下往补丁中写入了自己的版本,李纳斯也接受了。

安迪·克伦(Andi Kleen)则想为perf增加底层CPU事件支持。问题在于这可能会导致大量的底层事件,而且会因CPU的变化而改变。即使为了所有类型的CPU把可能的时间都存储在内存里,也可能会显著地增加内核的运行大小。因此,把这个信息硬编码进内核的方法是有问题的。

他也指出OProfile工具依赖于这些时间的公开可用列表,尽管他表示OProfile开发者并非总维持他们的列表与最新的可用版本一致。

为了解决这些问题,安迪提交了一个补丁,允许perf识别在给定的系统上为特定的CPU需要那种事件列表,并自动从起始位置下载这个列表的最新版本。然后perf可以解释这个列表并分析其中的事件,不会使内核负载过重。

有各种各样对安迪代码的反馈,其中大部分涉及到应该在哪个目录下保存事件列表和文件如何命名。这份代码本身的特性似乎得到了很好的回应。一处细节证明了安迪的代码比其他人的更有争议,就是将列表下载到用户家目录下的一个子目录。安迪表示如果不这样做的话,用户可能会以系统管理员的身份去下载事件列表,这会是危害安全的操作。

萨沙·莱文(Sasha Levin)最近发布了一个脚本来从堆栈转储中把十六进制的偏移量翻译成有意义的指向内核源码文件的行号。因此诸如“ffffffff811f0ec8”形式的十六进制表示可以被翻译成“fs/proc/generic.c:445”。

然而,结果表明李纳斯·托瓦兹正打算从堆栈转储中移除十六进制偏移量,具体原因是他们难以理解。所以萨沙的代码看起来过时了。[译者注:程序媛,伤不起!:< ]

他们在这个问题上纠结了一番。起初,萨沙打算依赖存储在System.map文件里的数据区补偿,但李纳斯指出包括他在内的有些人并不会保留System.map文件。李纳斯推荐使用/usr/bin/nm从编译好的内核文件中提取符号表。

所以,似乎萨沙的脚本可能确实为调试堆栈转储提供了有意义的文件和行号,假设堆栈转储提供足够的信息去完成计算。


via: http://www.linuxjournal.com/content/diff-u-whats-new-kernel-development-0

原文作者:Zack Brown

译者:KayGuoWhu 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux 内核补丁测试

你试过自己写内核补丁吗?本节介绍在把你的补丁包提交到 Linux 邮箱列表之前,需要做哪些操作。另外我们还会介绍如何把它发送出去。

写好代码后,编译它。把 make 过程产生的输出保存到文档中,查看新代码有没有警告信息。找到所有的警告信息,处理掉。当你的代码编译过程没有任何不正常的输出,安装这个内核,然后启动测试。如果启动正常,查看 dmesg 里面有没于错误,与老内核生成的 dmesg 日志做个比较。运行一些压力测试,请参考我们以前讲过的测试内容。如果这个补丁用于修复某个 bug,请确保真的已经修复了。如果真的修复了,请确保能通过系统测试。找出打你补丁的模块下面的回归测试工具,运行一下。如果补丁涉及到其他架构,你需要交叉编译然后测试一下。请通过下面的目录查找测试工具:

如果你对你的补丁测试结果感到很满意,你就可以提交补丁了。请确保提交 commit 的信息要描述得非常清楚。要让内核维护者和其他开发者看懂补丁所修改的内容,这一点非常重要。生成补丁后,执行 scripts/checkpatch.pl 脚本,找到 checkpatch 是产生的错误或警告(如果有的话),修复它们。重新生成补丁,直到补丁通过这个脚本的测试。重新测试这个补丁。将本补丁用于其他的内核源码上,保证不会有冲突产生。

现在你做好提交补丁的准备了。先运行 scriptst/get\_maintainer.pl 来确认你应该把补丁发给哪个内核维护者。注意不要以附件形式发送补丁,而是以纯文本形式粘贴在邮件里面。确保你的邮件客户端可以发送纯文本信息,你可以试试给自己发送一份补丁邮件来测试你的邮件客户端的功能。收到自己的邮件后,运行 checkpatch 命令并给自己的内核源码打上你的补丁。如果这两部都能通过,你就可以给 Linux 邮箱列表发送补丁了。使用 git send-email 命令是提交补丁最安全的方式,可以避免你的邮箱的兼容性问题。你的 .gitconfig 文件里面需要配置好有效的 smtp 服务器,详细操作参考 git 的帮助文档。

更多提交补丁的规矩,请参考下面的资料:

  • linux\_git/Documentation/applying-patches.txt
  • linux\_git/Documentation/SubmitChecklist
  • linux\_git/Documentation/SubmittingDrivers
  • linux\_git/Documentation/SubmittingPatches
  • linuxgit/Documentation/stablekernel\_rules.txt
  • linuxgit/Documentation/stableapi\_nonsense.txt

下面是一些内核测试教程的资料:

内核测试套件和项目

除我们讨论过的测试资源之外,这里还有很多测试项目值得介绍,包括开源的和厂家自己提供的。这些项目每一个都是针对特定领域的,比如嵌入式或者企业自己使用。我们简单过一下。

Linux 测试项目(LTP)测试套件是一系列工具的集合,用于测试内核的可靠性、健壮性和稳定性。你可以为这个项目添加自己的测试代码,并且 LTP 项目欢迎你贡献自己的代码。runltp 脚本默认情况下会测试下面的子系统:

  • 文件系统压力测试
  • 磁盘 IO 测试
  • 内存管理压力测试
  • IPC(进程间通信)测试
  • 调度器测试
  • 命令的功能性验证测试
  • 系统调用功能验证测试

LTP-DDT 是一个基于 LTP 的测试应用(LCTT:就是 LTP 的阉割版么),专注于测试嵌入式设备驱动。

Linux Driver Verification 这个项目的目标是提高 Linux 设备驱动的质量,它为设备驱动验证开发了集成环境平台,并且利用与时俱进的研究来增强验证工具的质量。

一致性测试

如果你有将某个 Unix 平台下的应用一直到另一个平台的经验,你就能理解 Linux Standard Base (LSB) 和 LSB 一致性测试套件的重要性了。LSB 是 Linux Foundation 工作组创建的用于降低支持不同 Linux 平台所需要的开销,方法就是通过降低不同 Linux 发行版之间的差别,保证应用在不同发行版之间的可移植性。前事不忘后事之师,Unix 世界的分歧在 Linux 世界一定要避免。这就是为什么你可以把一个 rpm 包转化成 deb 包后还能安装并正常运行的秘密。

静态分析工具

静态分析之所以会被称为“静态分析”,是因为这些工具只分析代码,并不执行它们。分析 Linux 内核代码的静态分析工具有很多,Sparse 是 Linus Torvalds 写的专门用于检查内核静态类型的工具。它是一个语义检查器,会为 C 语言的语义建立语义检析树,执行惰性类型评估。内核编译系统支持 sparse,并且为编译内核的命令提供开启 sparse 的选项。

为内核所有需要重新编译的 C 文件执行 sparse 语义检查:

make C=1 allmodconfig

为内核所有 C 文件(即使不需要重新编译)执行 sparse 语义检查:

make C=2 allmodconfig

Sparse 的资源:

Smatch 分析程序代码的逻辑错误。它可以检测到诸如“为一个没锁上的 spinlock 执行解锁”的逻辑错误。内核源码支持 smatch:

在 Linux 内核中运行 smatch:

make CHECK="~/path/to/smatch/smatch -p=kernel" C=1 bzImage modules | tee warns.txt

请参考下面的资料来获取和编译 smatch。需要注意的是 smatch 是个正在发展的项目,架构会不断变化。

那么我们该怎么处理 Sparse 和 Smatch 所发现的语义和逻辑上的错误呢?一些错误可以被分离为日常问题或模块问题,可以轻易被解决。但是有些语义错误涉及到全局,因为剪切粘贴了一些代码。在一些环境中,当一些接口函数被废弃不再使用,或者仅仅做了写微小的修改,你就需要大规模更新源码。这时候你需要 Coccinelle 来帮忙。,Coccinelle 使用 SmPL 语言(语义包语言)来为 C 代码提供匹配和转换代码的功能。Coccinelle 的从一开始就作为 Linux 的附属产品持续发展的。

举个例子:foo(int) 函数突然变成 foo(int, char *) 函数,多出了一个输入参数(可以把第二个参数置为 null)。所有调用 foo() 函数的代码都需要更新了,这可能是个悲摧的体力活。但是使用 Coccinelle 的话,这项工作瞬间变得轻松,脚本会帮你找到调用 foo(parameter1) 的代码,然后替换成 foo(parameter1, NULL)。做完这些后,所有调用这个函数的代码都可以运行一遍,验证下第二个参数为 NULL 是否能正常工作。关于 Coccinelle 的更多信息,以及在不同项目中(当然,也包括 Linux 内核这个项目)的使用方法,请参考项目主页:Cocinelle

参考文献

本文涵盖了很多方面,这里列出一些参考文档供读者做进一步研究。

鸣谢

感谢来自 Oracle 的 Khalid Aziz,审查校对并提供许多非常有价值的建议。感谢来自三星的 Mauro Chehab 和 Guy Martin,他们给了我多次反馈。感谢来自 Linux Foundation 的 Grey Kroah-Hartman 对本文的审阅。感谢来自三星的 Ibrahim Haddad,没有他的支持和鼓励,我可能还不会坐下来写出这篇文章。


作者:Shuah Khan

Shuah Khan 是三星公司开源组的高级 Linux 内核开发工程师。 她为 Linux 内核中的 IOMMU、DMA、电源管理、PCIe 贡献代码,同时维护内核,为内核提供补丁包。Shuah 有多年 Unix 内核开发经验。她也为 OpenHPI 和 LLDP 项目作贡献。


via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,5

译者:bazz2 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

仿真环境下进行 Linux 电源管理子系统测试

Linux 电源管理子系统在仿真环境下提供5种测试方式。这些方式仅仅在内核各层之间运行休眠的代码而不是真正的让系统进入休眠状态。有些平台不能挂起系统,比如说我们需要模拟飞机的飞行环境,这时候使用这种仿真环境就非常有用处了。

freezer - 测试停掉处理器:

echo freezer > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

devices - 测试停掉处理器以及挂起设备:

echo devices > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

platform - 测试停掉处理器、挂起设备以及平台全局控制方法(*)

echo platform > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

processors - 测试停掉处理器、挂起设备和平台全局控制方法(*),以及关闭未启动的 CPU。

echo processors > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

core - 测试停掉处理器、挂起设备和平台全局控制方法(*),关闭未启动的 CPU,以及挂起平台或系统的设备。注意:这个测试模式运行在 ACPI 系统。

echo core > /sys/power/pm_test
echo platform > /sys/power/disk
echo disk > /sys/power/state

Linux 电源管理子系统追踪事件

电源管理子系统在运行过程中支持多种追踪点和追踪事件。我将对如何使用这些追踪时间以及如何找到追踪信息作一个简单的介绍:

在运行时开启电源管理事件:

cd /sys/kernel/debug/tracing/events/power
echo 1 > cpu_frequency/enable
cat /sys/kernel/debug/tracing/set_event
less /sys/kernel/debug/tracing/trace

为内核启动的命令添加一个参数:

trace_event=cpu_frequency

更多信息查看 Documentation/power/basic-pm-debugging.txt 以及同目录下其他的文档。

git bisect 命令

git bisect 是一个非常有用非常强大的工具,用于将 git 上的一个 commit 分离出来。我简单过一遍它的用法。

下面是 git bisect 的用法:

git bisect start
git bisect bad   # 当前版本是坏的
git bisect good v3.14-rc6   # 上个版本是好的

一旦指定好好的版本和坏的版本,git bisect 就会开始把好坏两个版本之间的所有 commit 对半分,并将其中的一半提交 pull 下来。然后重新编译安装测试内核,并标记这个内核是好是坏。重复这个过程,知道某个你选好的 commit 被标记被好或者坏。我们可能需要测试多个内核版本,测到最后一个版本时,git bisect 会将一个 commit 标记为坏。下面的命令可以在 git bisect 分析过程中起到帮助作用:

查看 bisect 操作的过程:

git bisect log

重置 git bisect,标记错误时可以用到,保存 git log 的输出,重新操作上一次 bisect 的步骤:

git bisect reset

重放 git bisect 操作过程:

git bisect replay git_log_output

如果一个问题很清楚是在某个区域内,git bisect 命令可以定位到一个具体的内核源码树枝干上。举个例子,在调试一个镭龙显卡驱动的问题时,为 git bisect 指定 drivers/drm/radeon 参数,可以让 git bisect 只检索对 drivers/drm/radeon 里面的文件有修改的 commit。

让 git bisect 只检索内核树的某个枝干:

git bisect start drivers/drm/radeon

via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,4

译者:bazz2 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出