動機
改kernel的心得
備妥工具
vscode與trace tool
vscode的調整: 減少搜尋的範圍
{
"search.exclude": {
// 保留要改的部分,其他不要看
"**/.git": true,
"**/.svn": true,
"**/.DS_Store": true,
"**/drivers": true,
"**/sound": true,
"**/tools": true,
"**/arch/alpha": true,
"**/arch/arc": true,
"**/arch/c6x": true,
"**/arch/h8300": true,
"**/arch/hexagon": true,
"**/arch/ia64": true,
"**/arch/m32r": true,
"**/arch/m68k": true,
"**/arch/microblaze": true,
"**/arch/mn10300": true,
"**/arch/nds32": true,
"**/arch/nios2": true,
"**/arch/parisc": true,
"**/arch/powerpc": true,
"**/arch/s390": true,
"**/arch/sparc": true,
"**/arch/score": true,
"**/arch/sh": true,
"**/arch/um": true,
"**/arch/unicore32": true,
"**/arch/xtensa": true
},
//-------- Files configuration --------
// Configure glob patterns for excluding files and folders.
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.DS_Store": true,
"**/drivers": true,
"**/sound": true,
"**/tools": true,
"**/arch/alpha": true,
"**/arch/arc": true,
"**/arch/c6x": true,
"**/arch/h8300": true,
"**/arch/hexagon": true,
"**/arch/ia64": true,
"**/arch/m32r": true,
"**/arch/m68k": true,
"**/arch/microblaze": true,
"**/arch/mn10300": true,
"**/arch/nds32": true,
"**/arch/nios2": true,
"**/arch/parisc": true,
"**/arch/powerpc": true,
"**/arch/s390": true,
"**/arch/sparc": true,
"**/arch/score": true,
"**/arch/sh": true,
"**/arch/um": true,
"**/arch/unicore32": true,
"**/arch/xtensa": true
}
}
vscode的調整: includePath
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/arch/arm64/include/**",
"${workspaceFolder}/include/**",
"${workspaceFolder}/arch/arm64/**",
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
如果調整vscode還是太慢: GUN Global
裝GUN Global
sudo apt install global
裝外掛: C/C++ GNU Global
F12再打Global: Rebuild Gtags Database
但我自己用的時候,找reference時出現的item都會重複一次,像
void a(...)
void a(...)
void b(...)
void b(...)
...
注意: trace tool還是有可能翻車
像我是用cpptool去找 結果他找xt_mark.h,就帶到錯的地方, 是用global才找到原來還有其他的地方也又xt_mark.h
patch
linux kernel的資料夾很多,如果改的檔案很多又很分散,apply修改的結果會很累 用patch代勞
git add . #全部加到stage
git diff --staged > edit.diff
mv edit.diff to_some_where
cd to_some_where #optional
git apply -v < edit.diff
一步一步來
一次改一小步,不然很多時候會出現意想不到的錯誤 也不知道要從何改起
保留後路
一定要保留一個可以還原回去可以用的環境的手段 不然改爆就去世了
錯誤訊息是你的好友
只要不是像SegmentFault那種不知道到底發生事的錯誤訊息 就是好錯誤訊息
可以利用這個錯誤訊息去trace,找到需要改的地方
猜
通常不會等code全部看完再去改,一般都是一邊改一邊猜大概是怎麼實現的, 也是一邊改一邊了解到底在幹嘛
不要被嚇到
kernel code會有許多神奇的手法 像tcp的skb的繼承是用struct一層包一層 或是ipset是用header file來做繼承(幹,超難debug)
要把握這部分的code的目的是什麼,然後先跳過神奇的部分, 專注在code如何完成功能上
Google it
知名的kernel code可以賭會有人trace過 可以去看看前人的紀錄,給自己一點改與trace的線索與直覺