开源之夏 | 欢迎申请openEuler Kernel SIG开发任务,众多方向任你挑选!_内核开发

开源之夏是中国科学院软件研究所联合openEuler发起的开源软件供应链点亮计划系列暑期活动,旨在鼓励在校学生积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展。活动联合各大开源社区,针对重要开源软件的开发与维护提供项目,并向全球高校学生开放报名。


openEuler社区目前已上线94个项目!欢迎各大学子按照自己感兴趣或擅长的方向进行申请。


今天给大家带来内核方向的任务介绍,内核在Linux系统里的重要性不用多说,openEuler Kernel SIG 本次发布了16个内核方向的项目任务,涵盖内存、架构、公平调度等多个模块。


Kernel SIG的项目任务覆盖面广,难易程度适中。欢迎大家参与到Kernel SIG的项目中,我们将为大家提供丰富的学习资源和技术指导,深入浅出地带你探索内核技术领域 。你的技术能力将得到快速提升,成长为极具竞争力的内核领域技术人才。


项目1:利用eBPF实现自定义pagefault处理

项目描述:

userfaultfd目前实现了将pagefault上报到用户态处理,但是处理策略有限,而且整个流程有多次系统调用性能开销较大。期望通过eBPF代替userfaultfd实现自定义pagefault处理。

产出标准:

1、代码合入openeuler

2、测试虚拟机热迁移场景,对比原生userfaultfd的性能差异

技术要求:

1、熟练使用eBPF编程

2、熟悉Linux内存管理

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970595?lang=zh&list=pro


项目2:基于openEuler kernel开发一款能统计所有流经netfilter hook IP的内核ko

项目描述:

方便开发维护人员感知报文流向

产出标准:

1、一个内核ko,注册netfilter 记录报文

2、一个命令行工具,查看各个hook点的报文

技术要求:

1、c语言

2、Linux kernel

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970590?lang=zh&list=pro


项目3:利用eBPF实现内存回收灵活控制

项目描述:

不同的业务进程可能有不同的内存冷热特征、不同的内存使用策略,而当前linux内核中内存回收基于的LRU管理策略是统一的,缺少针对不同应用的灵活性,期望通过eBPF实现内存回收灵活控制

产出标准:

1.支持进程、cgroup粒度的LRU策略控制、调整LRU链表

2.支持文件页、匿名页的回收比例控制或者独立回收控制

3.支持针对进程或者容器的定制化LRU链表

技术要求:

1、熟练使用eBPF开发

2、熟悉Linux内存管理机制

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970587?lang=zh&list=pro


项目4:扩展Trace event filter功能,增加根据函数调用栈过滤功能

项目描述:

trace事件是内核经常使用的维测功能。对于基础的内核接口,可能存在很多的调用路径。按照常规的方式使用Trace event会输出全部的维测信息。而我们可能只关注其中的特定路径。

产出标准:

扩展trace event的filter功能,实现支持根据函数调用栈进行过滤。

技术要求:

熟悉Linux内核开发

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970583?lang=zh&list=pro


项目5:arm64 ftrace: 为注册ftrace的函数增加独立的跳板优化arm64 ftrace机制的性能

项目描述:

arm64 ftrace性能优化,当前arm64注册ftrace使用ftrace_ops_list_func扫描注册好的ftrace ops链表,该实现方式会影响ftrace性能,因此请你为注册ftrace的函数增加独立的跳板跳转到ftrace ops,主要涉及的工作如下:函数注册ftrace ops(包含回调地址)时,帮助被注册函数(通常使用ftrace_(regs_)caller当作跳板)直接跳转到注册的回调地址,而不是通过扫描多个ftrace ops链接的ftrace_list_ops来最终找到注册的ftrace ops。

产出标准:

代码合入openeuler;设计测试用例测试出收益并输出测试。

技术要求:

linux内核开发技术栈

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970574?lang=zh&list=pro


项目6:Outbox驱动打入内核用以支持系统安装

项目描述:

随着存储、网络等硬件的发展,很多新的硬件具备很多新的能力,但是openEuler老的lts的内核版本并不支持此类硬件,导致系统无法安装,或者无法使用新的能力。需要在系统安装前或者安装过程中将outbox驱动添加到标准镜像中用于支持这类场景。

产出标准:

出工具打包成rpm,提供命令改造标准镜像能够支持安装过程中使用outbox驱动

技术要求:

不限,推荐使用脚本类语言

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970569?lang=zh&list=pro


项目7:基于机密计算实现密钥管理系统

项目描述:

当前密钥管理主要是KMS和HSM两种方案。然而这两种方案都有一些缺点:KMS有安全性问题、依赖互联网等缺点,HSM有成本高、密钥管理能力有限等缺点。

机密计算是基于硬件可信执行环境的安全保护技术,能够在保证数据安全的同时使用数据进行计算。因此我们可以基于机密计算实现一个密钥管理系统。该系统实现成本低,且不仅可以为系统上的应用提供密钥管理,也可以通过网络服务对外提供密钥管理服务。

解决方案: 

使用secGear框架,基于机密计算的能力,实现一个密钥管理系统。

产出标准:

基于机密计算实现一个密钥管理系统

技术要求:

了解机密计算技术、熟悉常用加密算法的使用、熟悉C、Cmake

项目导师:

https://summer-ospp.ac.cn/org/prodetail/23b970551?lang=zh&list=pro


项目8:内存盘支持io统计功能

项目描述:

io统计是内核在处理io过程中记录的额外信息,通过接口 /proc/diskstats 或者 /sys/block/[device]/stat 暴露给用户,用户可以通过iostat等工具查看设备的io信息,例如:读写带宽,iops,磁盘利用率等等。当前内核驱动中内存盘没有实现该功能,用户在使用内存盘时将无法获取io信息。

产出标准:

1、内核补丁,用于支持内存盘的io统计功能,需要做成模块参数,可以控制是否使能;

2、测试报告,1)用于验证内存盘的io统计功能;2)高io压力下测试场景下使能和不使能io统计功能时,对性能的影响。

技术要求:

1、首先内核开发基础

● 内核编译,内核替换(虚拟机或者物理机都可以)

2、其次在用户态,需要掌握

● 内存盘的使用,如何创建与删除内存盘(内核模块的插入与卸载,modprobe, rmmod)

● 使用fio, dd等工具或者自己写一个c程序,对磁盘进行读写

● 使用iostat观测内存盘的io情况

这两部分网上都有比较详细的资料,可以自行搜索。

3、最后在内核态,需要通过阅读内核代码,做到

● 了解内核io栈和驱动层的实现,其中驱动层有基于rq的模式和基于bio的模式,内存盘是基于bio的模式(代码位置 drivers/block/brd.c)系统调用入口:vfs_read(), vfs_write()等

○ 通用块层入口:submit_bio()

○驱动入口:block_device_operations 中的钩子 submit_bio,内存盘为 brd_submit_bio

●内核io统计的实现,核心代码在include/linux/part_stat.h,

○bio模式的驱动,涉及的接口有 bio_start_io_acct 和 bio_end_io_acct

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970550?lang=zh&list=pro


项目9:在 ARM64 上实现基于 PAC 的数据流完整性(DFI)

项目描述:

基于 ARMv8.3 新引入的 PAC 特性,可以实现对控制流完整性(CFI)和数据流完整性(DFI)的保证。当前已知 macOS 上两者都有实现,而 Linux 内核仅实现了基于 PAC 的 CFI。本项目旨在设计一套基于 PAC 特性对 Linux 内核中的关键数据结构实施 DFI 的方案,并予以实现。

产出标准:

1、基于 PAC 的 DFI 方案设计文档,包括防护原理,目标数据结构等内容;

2、上述方案的代码实现以及测试报告,测试覆盖:防护效果、性能影响、内存底噪、镜像大小影响;

3、 补丁最终合入 openEuler 内核。

技术要求:

1、熟悉 C 语言和 Linux 内核开发;

2、熟悉 ARM64 汇编及 Linux 内核上的汇编语言编程方法;

3、 熟悉编译原理及 GCC 编译器插件的开发;

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970544?lang=zh&list=pro


项目10:IOVA管理优化

项目描述:

IOMMU模块中的IOVA管理采用的是论文USENIX 2001 paper "Magazines and Vmem: Extending the Slab Allocator to Many CPUs and Arbitrary Resources"机制,但是长期运行时后,会由于存在大量缓存的IOVA而导致查找和分配新的IOVA性能下降,需要设计一个良好的平衡机制。

产出标准:

1、在适当的时机释放一些空闲的IOVA,避免红黑树过于庞大,但不影响正常申请释放IOVA的性能

2、避免跨NUMA结点访问,magazine和iova本地化;

3、减少共享magazine和红黑树操作的锁冲突

4、基于openEuler 5.10内核开发

技术要求:

1、熟悉Linux内核开发

2、熟悉IOMMU

3、熟悉iperf和fio测试

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970543?lang=zh&list=pro


项目11:实现arm32上的bpf trampoline和direct call

项目描述:

bpf tramploline是bpf的核心机制之一,将native calling convention转换为bpf calling convention,direct call则允许从普通内核函数入口直接跳转到用户自定义的handler上,两者结合可以用来实现将bpf prog作为tracing handler直接attach到内核函数或者另一个bpf prog入口上,实现高性能的trace功能,bpf trampoline也可以单独和bpf prog配合实现用bpf prog作为普通的回调函数来使用.

产出标准:

1、实现arm32上的bpf trampoline,跑通内核仓下的fexit_bpf2bpf、xdp_bpf2bpf、bpf_tcp_ca、dummy_st_ops用例;

2、实现arm32上的direct call,跑通内核仓下的fentry_test、fexit_test、fentry_fexit、modify_return、get_func_args_test、get_func_ip_test用例.

技术要求:

1、C语言

2、arm32汇编

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970540?lang=zh&list=pro


项目12:优化arm32启动流程

项目描述:

arm32启动过程中,内核支持地址随机化,当前这块实现需要遍历所有的物理内存,并逐个比较是否存在内存冲突,存在比较多的冗余操作,优化arm32随机化实现,缩短启动时间。

产出标准:

1、优化arm32随机化实现

2、完成对arm32启动性能的测试,提供测试数据报告

3、基于openEuler 5.10内核开发

技术要求:

1、熟悉Linux内核开发

2、熟悉ARM架构启动流程

3、熟悉基于QEMU的内核调试流程

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970532?lang=zh&list=pro


项目13:arm64支持objtool以及ORC推栈

项目描述:

objtool是x86上实现的二进制文件分析工具,其主要功能用于支持x86上的可靠推栈方案:通过编译时生成ORC推栈元数据,可以在内核运行时实现可靠推栈。

由于可靠推栈是内核热补丁功能的必要条件,arm64目前只支持FP推栈,将objtool以及ORC推栈移植到arm64是有价值的。

1.  对此,主要涉及的工作如下:适配objtool工具到arm64(部分已完成)

2.  在arm64上实现ORC unwinder

3.  进行ORC unwinder的功能测试

此功能的实现涉及内核推栈机制、二进制指令分析、arm64体系架构等内容,范围较广,具有一定挑战性。

产出标准:

1.  openEuler 合入实现 arm64 ORC unwinder 的PR

2.  功能测试的测试设计,测试用例与测试报告

技术要求:

linux内核开发技术栈

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970530?lang=zh&list=pro


项目14: 零页内存池

项目描述:

对于应用申请内存时,为了防止内存信息泄漏,经常需要对内存进行清零操作,如果清零时间占比很大,可能导致应用性能波动或者下降,实现一套零页内存池方案,在需要零页时,从零页内存池获取内存,取代现有从伙伴系统获取内存和清零操作。

产出标准:

1、提供内存零页池框架,支持小页、THP大页内存池,动态扩展和缩容内存池容量;

2、为了避免锁冲突,考虑实现per-cpu的零页缓存;

3、为了避免numa时延影响,考虑实现按照numa粒度内存池

4、基于openEuler 5.10内核开发

技术要求:

1、熟悉Linux内核开发

2、熟悉内存管理机制

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970473?lang=zh&list=pro


项目15:eBPF软件应用市场

项目描述:

目前在容器、软件加速及维测上,社区开发了很多相应eBPF程序,而对于这些eBPF程序缺乏统一的分发方式。cilium等独立组件都有自己的管理方式,bcc等工具集也有自己的打包方式,openEuler内核开发的一些eBPF插件在内核仓进行发布。但是这些eBPF程序的升级及增加新的功能都依赖于整体软件的发布,存在升级周期长等问题。另外eBPF程序开发难度需要了解内核eBPF程序框架,相对来所开发难度较高。本任务希望能借鉴docker hub的管理模式,提供openEuler内核eBPF开发模板,及相应的编译分发的工具,解决eBPF软件打包分发难题。

产出标准:

1、构建openEuler应用市场基础设施,提供类似于docker hub的eBPF程序管理模式

2、  提供openEuler eBPF软件编写模板,简化编译和打包及分发流程。

技术要求:

1、熟练使用eBPF编程

2、熟悉Linux内存管理

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970467?lang=zh&list=pro


项目16:内核公平调度任务(CFS)被高优先级任务(如RT任务)抢占后饿死场景监控

项目描述:

在实时调度与公平调度并存的产品业务场景,公平调度(CFS)任务可能会因为实时调度任务长时间占用CPU而得不到及时的调度,会导致正常用户业务将受到影响、且串口无法进行调测定位。本特性通过监测CFS进程的调度情况,当发现CFS进程调度饿死时,及时输出相关的调测信息,协助定位问题原因。

产出标准:

1、输出合理的设计文档。

2、编码符合clean code 规范,模块独立,无侵入式修改。

3、模块功能满足项目要求,能对CFS进程被RT进程长时间抢占后的饿死情况进行检测监控,可以设置检测阈值,以及需要被检测的CPU。

4、  模块运行资源消耗低,CPU占用率不高于1%

技术要求:

1、熟悉linux 内核编程框架,基于openEuler 内核进行开发。

2、熟练掌握C语言。

3、对linux调度子系统有一定的掌握,熟悉内核通用的进程异常检测机制。

项目导师:

项目主页:

https://summer-ospp.ac.cn/org/prodetail/23b970403?lang=zh&list=pro


活动日程及参与方式


目前正处于学生注册、沟通导师、提交项目申请环节。


开源之夏 | 欢迎申请openEuler Kernel SIG开发任务,众多方向任你挑选!_实习_02