今天想要來看看 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 | 支援巨大分頁 |
上面提到這麼多的核心功能,就挑裡面我比較理解的,來看看有什麼功用吧!
這邊整理了一些 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!