iT邦幫忙

2021 iThome 鐵人賽

DAY 4
1
Software Development

閱讀 Linux Kernel 文件系列 第 4

# 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!


上一篇
# Day3 Virtual Memory Layout on RISC-V Linux
下一篇
# Day 5 Supporting PMUs on RISC-V platforms (一)
系列文
閱讀 Linux Kernel 文件30

1 則留言

0
高魁良
iT邦新手 4 級 ‧ 2021-09-13 23:21:40

真的要挑戰 PMU 嗎?那個部分已經快要被 Anup 他們移除了...

我要留言

立即登入留言