泰晓科技 -- 聚焦 Linux - 追本溯源,见微知著!
网站地址:https://tinylab.org

基于泰晓RISC-V实验箱的Linux公开课
请稍侯

Linux 发布 5.1, Linux Lab 同步支持

Wu Zhangjin 创作于 2019/05/17

By Wu Zhangjin of TinyLab.org May 09, 2019

近期 Linux 发布了 5.1 版,Linux Lab 同步升级到该版本,详情如下。

Linux

2019 月 5 月 5 日,Linus 如期发布了 Linux 5.1,该版本包含如下重要更新:

  1. io_uring, 新增的一个高性能异步 IO 接口,改善了内核早期 AIO 的缺陷,在原有 unbuffered I/O 支持之外,增加 buffered I/O 和 Polled I/O 支持,该接口的用法请参考 一个完整的例子

  2. fanotify,增加 ‘super block root watch’ 功能,主要解决早期用 recursive inotify watch 监控大型文件系统中超大目录树上的 dirent modification events(create/delete/move) 的低性能问题。4.20 已经合并了该 patchset supper block 部分的内核与 user API 支持,5.1 合并了剩下的 dirent modification events (create/delete/move) 相应支持。

  3. pidfd_send_signal, 新增的一个系统调用,用于解决 PID 重用引起的信号发送到其他进程的问题,这个系统调用使用 /proc/<pid> 下面的文件描述符取代 pid 本身。Linux 下 PID 资源有限,当某个进程退出后,其 PID 会被新启动的任务使用,如果信号发给某个 PID,这个 PID 可能已经退出,导致信号发送给了正在复用这个 PID 的其他任务。这个问题在 Android 上已经引起了大量安全问题

  4. Use persistent memory as RAM / Persistent memory for transient data,Linux 支持 persistent memory,但是一直是当 storage device,这个 feature 引入以后,像 NVDIMMs 这样物理上 persistent (like flash) 的设备就可以当低成本的 RAM 使用了。不过,也有很多同学担心,transient data 被保存到 persistent memory 以后,这个会不会有敏感数据的安全问题,所以大家的关注点回到 persistent memory 的设备数据加密能力上。

  5. cpuidle governor: TEO,内核原来有两个 cpuidle governors: menuladder,用于决策当系统闲置的时候,该进到哪个深度的 idle 状态(越深越省电但是退出来则更久,越深通常是关掉更多 clock、更多 power domain),当有设备中断和 timer 来了以后会再退出来(逐个开启 clock、power domain),所以这个 governor 要能比较准确地预测下一个中断和 timer 什么时候要来,而且各个 cpu idle states 必须很准确地配置好自己的进出时间,两者 match 好的话,就能即省电又满足系统调度需求。laddr 由浅入深地选择 idle state,比较适合传统的 clock ticks 以及不怎么关注省电的场景,而 menu governor 根据计算预测下一个 idle duration,选择最适合的那个 idle state,不会先浅后深,所以更适合 tickless 的场景,不过它也有不少缺陷,这个 teo governor 引入进来就是针对 menu governor 做的准确度方面的改善。决策逻辑更为简单直接,不再考虑系统 loading 和 iowait(考虑为无关因素),主要以 next timer event 为依据来计算 idle duration,先据此选择 idle state,并同时评估过去一段时间(比如最近 8 个 idle wakeups)的 non-timer events 的 idle durations,如果都满足则 ok,否则选一个更浅的 idle state。不直接替换 menu 的原因是,希望留一些时间验证,避免引起重大 perf 和 power 衰退。看上去很不错,但是应用到实际产品之前建议谨慎充分地测试 perf 和 power 的数据。

  6. prepare for the year-2038 problem,使用 C 语言撰写的系统,用 signed int32: time_t 来记录相对 1970 年 1 月 1 日的秒数,32 位的最后时间是 2038年1月19日03:14:07,星期二。到了这个时间的下一秒以后,会溢出变成负数,回到 1901 年。这次先为 32 位架构增加一个 64-bit time_t(到 2900 亿年后再伤脑筋去吧),而后再为所有架构增加。内核改完以后,得换系统的代码库,否则 App 还在用老的 time_t 一样会有问题,所以 year-2038 问题还要持续一段时间才能修复完毕。

  7. Boot to a device-mapper device without ramfs,如果不想用或者不能用 initramfs,现在可以直接在启动过程中传递 DM targets 作为启动参数来指定 root device 等。device-mapper 是内核中支持逻辑卷管理的通用设备映射机制,目前被广泛应用于 Docker,它相比普通文件系统有更多优势,主要包括 Snapshot, Thinly-Provisioned Snapshot,两者结合以后可以做到允许多个虚拟设备同时挂载到一个数据卷以达到共享数据的目的,从而类似 AUFS 实现分层挂载的效果。

  8. Live patching: support cumulative patchset,如果针对某些 functions 有多个 live patches,必须要定义 patch apply 的顺序,对于发行版维护来说会比较困难,所以这里提供了一种把所有 livepatches 打包成一个 “cumulative patches” 的方式,包含所有针对老的 livepatches 的变更并且可以一次性替换。看上去有点类似 Android 的增量包,两个版本之间有一系列逐步演进的增量包,也可以有合并成一个单一的增量包。

  9. 新增 driver_async_probe 内核启动参数,可以更方便灵活地启用或者测试某些设备的 async probing,从而加速内核启动。数年前,笔者给内核提交过一笔 async probing RFC,这笔 RFC 试图允许配置某个 device 可以 async probe 并且允许定义不同 device probing 之间的依赖关系。这个 RFC 引起了后续的大量讨论和最终的 async probing 支持,不过笔者由于忙产品去了,一直没有参与后续的演进。

  10. 给用户空间抛出能量模型接口,方便调试,EAS 引入的 Energy Model 用于管理不同 CPU 的 power cost tables,这个表之前只能在内核查看,为了方便调试 EAS,这个 patch 增加了一个 /sys/kernel/debug/energy_model 允许用户空间查看。

  11. 增加一个控制接口,允许关闭 EAS,EAS 目前在具有 Energy Model 的非对称处理器平台上是默认开启的,但是基于 thermal 管理的考虑,可能需要关闭它,所以这里新增一个 sysctl sched_energy_aware 允许通过设为 0 后关闭。猜测是目前 EAS 未能很好地兼顾 thermal 的算法。thermal 需要动态调节 CPU Freq 和核数,算法可能跟 EAS 有冲突,thermal management 其实可以考虑也基于 Energy Model,从 Power cost 和 perf 两个角度排序来调节 cpu freq。

其他改动还有很多,比如移除 a.out 支持,开启 lzo 在 ARM64 平台的 rbit/clz 优化,更多修改说明请查阅:Linux KernelNewbies 5.1 ChangeLog

Linux Lab

Linux Lab 是一个学习和开发 C 语言、Linux 内核、嵌入式 Linux、Qemu、Uboot 的一体化和自动化的工具,提供了一个完整、高效、即时可用的实验环境,支持 Windows, Mac OSX 和 Linux,已经内置 4 大主流架构和 6 款开发板支持。如果网速可以,Linux Lab 可以在数十分钟内搭建完成。

近日,为了满足大家对新内核特性的研究需要,笔者经过几天的奋力移植,目前几大架构和开发板已经全部升级到最新的 Linux 5.1,并且全部提供了预制的交叉编译工具、预编译的内核镜像/DTB/Uboot、预制作的根文件系统、预编译的 Qemu 模拟器,下载即用。

目前支持的状态如下:

$ make list
[ g3beige ]:
      ARCH     = powerpc
      CPU     ?= generic
      LINUX   ?= v5.1
      ROOTDEV ?= /dev/ram0
[ malta ]:
      ARCH     = mips
      CPU     ?= mips32r2
      LINUX   ?= v5.1
      ROOTDEV ?= /dev/ram0
[ pc ]:
      ARCH     = x86
      CPU     ?= x86_64
      LINUX   ?= v5.1
      ROOTDEV ?= /dev/ram0
[ versatilepb ]:
      ARCH     = arm
      CPU     ?= arm926t
      LINUX   ?= v5.1
      ROOTDEV ?= /dev/ram0
[ vexpress-a9 ]:
      ARCH     = arm
      CPU     ?= cortex-a9
      LINUX   ?= v5.1
      ROOTDEV ?= /dev/ram0
[ virt ]:
      ARCH     = arm64
      CPU     ?= cortex-a57
      LINUX   ?= v5.1
      ROOTDEV ?= /dev/ram0

在 ARM64/virt 板子上启动 Linux 5.1 命令行演示效果如下:

Linux Lab 的视频演示视频:

更多用法请参考:

  1. 项目源码 的 README.md
  2. 项目首页 的 五分钟教程

Linux Lab 会持续更新,欢迎大家用于日常 Linux 内核研究,也可以用于企业内部培训,用于高校 Linux 课堂实验等环节。

欢迎加笔者微信:lzufalcon,保持进一步联系。



Read Related:

Read Latest: