動機

改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的線索與直覺

Ref

vscode的調整 vscode與GUN Global