# Day 4 Feature status on riscv architecture

今天想要来看看 RISC-V Linux 核心有支援哪些核心功能(需要各个架构自行实作的核心功能)。

文件

子系统 特点 Kconfig 状态 简介
core cBPF-JIT HAVE_CBPF_JIT TODO 支援 cBPF JIT 的优化
core eBPF-JIT HAVE_EBPF_JIT ok 支援 eBPF JIT 的优化
core generic-idle-thread GENERIC_SMP_IDLE_THREAD ok 利用通用 SMP 闲置执行绪的基础设施
core jump-labels HAVE_ARCH_JUMP_LABEL ok 支援动态调整,高效率的分支
core thread-info-in-task THREAD_INFO_IN_TASK ok 利用核心基础设施把 thread_info 置入 task_struct 内
core tracehook HAVE_ARCH_TRACEHOOK ok 支援处理 tracehook (ptrace) 暂存器的应用程序介面
debug debug-vm-pgtable ARCH_HAS_DEBUG_VM_PGTABLE ok 支援针对是否符合
debug gcov-profile-all ARCH_HAS_GCOV_PROFILE_ALL ok 支援整体核心 GCOV 程序码覆盖率的剖析
debug KASAN HAVE_ARCH_KASAN ok 支援 KASAN 动态的记忆体检查
debug kcov ARCH_HAS_KCOV ok 支援 kcov 基於程序码覆盖率所做的随机测试
debug kgdb HAVE_ARCH_KGDB ok 支援 kGDB 核心除错器
debug kmemleak HAVE_DEBUG_KMEMLEAK ok 支援核心记忆体漏失侦测器
debug kprobes HAVE_KPROBES ok arch supports live patched kernel probe
debug kprobes-on-ftrace HAVE_KPROBES_ON_FTRACE ok arch supports combined kprobes and ftrace live patching
debug kretprobes HAVE_KRETPROBES ok arch supports kernel function-return probes
debug optprobes HAVE_OPTPROBES TODO arch supports live patched optprobes
debug stackprotector HAVE_STACKPROTECTOR ok 支援编译器辅助的 stack overflow 保护机制
debug uprobes ARCH_SUPPORTS_UPROBES ok arch supports live patched user probes
debug user-ret-profiler HAVE_USER_RETURN_NOTIFIER TODO arch supports user-space return from system call profiler
io dma-contiguous HAVE_DMA_CONTIGUOUS ok 支援 DMA 的连续记忆体配置器
locking cmpxchg-local HAVE_CMPXCHG_LOCAL TODO 支援 this_cpu_cmpxchg() API
locking lockdep LOCKDEP_SUPPORT ok 支援动态 locking 正确性除错的基础设施
locking queued-rwlocks ARCH_USE_QUEUED_RWLOCKS TODO arch supports queued rwlocks
locking queued-spinlocks ARCH_USE_QUEUED_SPINLOCKS TODO arch supports queued spinlocks
perf kprobes-event HAVE_REGS_AND_STACK_ACCESS_API ok arch supports kprobes with perf events
perf perf-regs HAVE_PERF_REGS ok 支援 perf 事件暂存器的存取
perf perf-stackdump HAVE_PERF_USER_STACK_DUMP ok arch supports perf events stack dumps
sched membarrier-sync-core ARCH_HAS_MEMBARRIER_SYNC_CORE TODO arch supports core serializing membarrier
sched numa-balancing ARCH_SUPPORTS_NUMA_BALANCING ok arch supports NUMA balancing
seccomp seccomp-filter HAVE_ARCH_SECCOMP_FILTER ok arch supports seccomp filters
time arch-tick-broadcast ARCH_HAS_TICK_BROADCAST ok 提供 tick_broadcast()
time clockevents !LEGACY_TIMER_TICK ok 支援通用的时脉事件
time context-tracking HAVE_CONTEXT_TRACKING ok arch supports context tracking for NO_HZ_FULL
time irq-time-acct HAVE_IRQ_TIME_ACCOUNTING ok 支援精准 IRQ 时间的稽核
time virt-cpuacct HAVE_VIRT_CPU_ACCOUNTING TODO 支援精准虚拟 CPU 时间的稽核
vm batch-unmap-tlb-flush ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH TODO 支援 "将 TLB flush 延至多个分页被取消映射时执行"
vm ELF-ASLR ARCH_HAS_ELF_RANDOMIZE ok "arch randomizes the stack,heap and binary images of ELF binaries"
vm huge-vmap HAVE_ARCH_HUGE_VMAP TODO 支援 arch_vmap_pud_supported() 和 arch_vmap_pmd_supported() 虚拟记忆体 APIs
vm ioremap_prot HAVE_IOREMAP_PROT TODO 支援 ioremap_prot()
vm PG_uncached ARCH_USES_PG_UNCACHED TODO 支援 PG_uncached 分页旗标
vm pte_special ARCH_HAS_PTE_SPECIAL ok 支援 pte_special()/pte_mkspecial() 虚拟记忆体 APIs
vm THP HAVE_ARCH_TRANSPARENT_HUGEPAGE ok 支援巨大分页

我的理解

上面提到这麽多的核心功能,就挑里面我比较理解的,来看看有什麽功用吧!

  1. core subsystem
    • cBPF、eBPF JIT:cBPF(classic Berkeley Packet Filter) 顾名思义是 Kernel 用来做封包过滤的模组,eBPF(extended BPF) 则是原本 BPF 的延伸,常用於 kernel profiling 观察和除错。
    • generic idle thread:系统处於闲置状态时,kernel 会分配 idle task 给各个 thread 来执行,而 idle thread 的实作,是 architecture-specific 的。 (想想也是有道理,不同的 architecture 会有不同的 PM,所以在 idle 时,想要做什麽来达到更好的能效,由各个架构来做定义也满合理的)
    • jump label:可以在动态时期,把一些确定不会变动的分支(例如: if(!CONFIG_XXX) 这种分支)消除掉,调整为不需要分支的结构,来提升效能。
    • thread-info-in-task:感觉跟 thread_info 的大小有关,但还没有看得很懂 (stack overflow)
    • tracehook
  2. debug subsystem
    • gcov-profile-all、kcov:GCOV 是 GCC toolchain 中程序码覆盖率的测试工具,KCOV 则是透过 sysfs 来将核心程序码覆盖率资讯,传递给使用者使用。
    • stackprotector:需要编译器支援,会在 stack 上加入 canary 来做 stack overflow 的侦测
    • KASAN、kmemleak:KASAN 是一个 Kernel 用来动态检查是否有越界存取记忆体行为的检查模组,kmemleak 则是检查是否有 memleak 的现象 (有 kmalloc 但没有 kfree 等等)
    • debug-vm-pgtable
    • kprobes、kprobes-on-ftrace、kretprobes、optprobes、uprobes:probe 机制大多数都是在 function 开头,插入某些 init、enable 的程序码,并在 return 的时候,fini、disable 所以可以记录是否有执行某些 function,甚至是可以记录执行时间等等,是 ftrace 等等 tracing 机制的基础设施。
    • user-ret-profiler
  3. locking subsystem
    • lockdep:可以动态的检测 locking 的正确性,是否有不预期的 dead lock
    • queued-rwlocks、queued-spinlocks:为了解决原本 rwlock、spinlock 的公平性问题,而设计出来的 lock 机制。
    • cmpxchg-local
  4. perf subsystem (performance)
    • kprobes-event
    • perf-regs
    • perf-stackdump
  5. sched subsystem (scheduler)
    • membarrier-sync-core
    • numa-balancing
  6. time subsystem
    • arch-tick-broadcast
    • clockevents
    • context-tracking
    • irq-time-acct
    • virt-cpuacct
  7. vm subsystem (virtual memory)
    • batch-unmap-tlb-flush
    • ELF-ASLR
    • huge-vmap
    • ioremap_prot
    • PG_uncached
    • pte_special
    • THP
  8. MISC
    • seccomp-filter
    • dma-contiguous

这边整理了一些 feature 的简介,有些是目前超出我的理解范围、有些则是时间上来不及,所以先空着,希望有机会再回来检视补齐罗!

後记

  • 有些东西真的太难翻译啦!XD

    • arch supports live patched user probes 感觉英文还比翻成中文之後好懂 XD
    • 有些不好翻译的语句,就也不硬翻成中文了
  • 还有打开 ${linux}/Documentation/riscv/features.rst 发现只有以下两行,看来这个 feature 应该是透过某种方式被自动产生出来,看来这篇翻译的 patch 并不是直接翻译就可以完成的。

    .. SPDX-License-Identifier: GPL-2.0
    
    .. kernel-feat:: $srctree/Documentation/features riscv
    
    • 检视了文件内所提到的路径 $srctree/Documentation/features,发现有一个 list-arch.sh,猜测是在文件"编译"的过程中,会去执行这个脚本,而这个脚本就会去遍历 feature 资料夹中所有描述 feature 的档案,来确认哪些架构支援哪些功能,最後在 render 出这一个表格。
  • linux-doc 的 maintainer 终於回信了,他指出我并没有在适当的 index 档案内,加入新增的翻译档案,希望修正这些,并且提醒每次再送 patch 之前,要先 build 过,确认 make 的过程是可以正确结束的,再送 patch;的确是一个当头棒喝啊!前几天再送 patch 的时候,都只有跑过 checkpatch.pl,并没有实际把整个文件相关的档案都 build 过、检验过,确实不可取!

  • Kernel 的功能非常的多样,有的用在除错、有的用在效能分析,而各个项目相关的技术也是多如牛毛,所以想要成为一个 kernel 程序码的贡献者,说难吗?其实机会非常的多,看看这个表格 status 还是标示 TODO 的部分;但说简单吗?核心程序码的检验非常的严格,但的的确却不失为一个自我挑战的好机会!

  • 这篇结束後,RISC-V 相关的文件就只剩下 PMU 了!在蒐集相关资料的过程中,发现在 RISC-V Task Group 有大量的讨论,而相关的 Spec 也在今年有了个样子,感觉对我来说会是个不那麽好懂的文件,可能会需要多点时间爬梳,所以接下来可能会留个几天,来仔细地看看这份文件,那麽我要先来去修前几天的 patch 罗!

感谢各位观看,我们明天再来一起挑战 PMU!


<<:  Day 13 复习 golang concurrency 语法篇 II

>>:  Day 13 | 同步与非同步- Thread类别与runOnUiThread()方法

[DAY 28] _看门狗简介_视窗看门狗(2)

昨天主要介绍了视窗看门狗和独立看门狗的差别,今天来看这如何计算,这计算方式再参考手册里面有举例说明,...

Day12 NiFi - Reporting Task & Bulletin Board

今天来带大家了解一下 NiFi 原生的 Monitoring 是怎麽运作的,像是 Disk, Mem...

[30天 Vue学好学满 DAY16] slot 插槽

slot 在子元件(内层)中预留空间,由父元件(外层)设定、分配内容。 子元件本身对slot无控制权...

【Day28】2次收敛除法器实作

接下来探讨一种透过牛顿法来找到相除解的方法 收敛除法 Step1 : 规格化 N 和 D,令 D 趋...

[Day01] - 旅途开始前的茶室闲聊

去年宝哥在 Modern WEB 中介绍过 Angular 有时会发生版本不相容的 issue , ...