作者:
ericerix (Ponwar)
2022-08-31 22:53:34大家好,小弟的工作跟 MCU 有關
近期工作剛 on board,導師要我先看一個資料夾內的 Code
裡面看起來像是一個 task 的 create、initilize 跟 API
以往經驗,我會先找一個程式的 main function 當入口,然後順著邏輯去看 code
但這套似乎沒辦法用在 Kernel 上,
我查的資料也是說:
Kernel 比較像是一個狀態機的架構,只有init process 能夠像我這樣"flow"的方式去 trace
(參考自:https://reurl.cc/zNDnMp)
我覺得蠻有道理的,畢竟我真的找不太到這個 task 的 entry 點,
勉強來說的話,應該是我上述的 create、initialize function 吧
但這些又如何串上 API 呢?
上方的網站內有提及,
有些 function 可以不必深入進去看實作,大概知道他的作用即可,
我想也是,
畢竟我看的 Code 也是一直去呼叫別人包好的 API
我沒有 trace Kernel 的經驗,希望有大大能夠給我指引,謝謝。
作者: breeze08 (linuxer) 2022-08-31 23:02:00
你的kernel指的是linux kernel還是RTOS?RTOS原始碼量比較少,花些時間是可以看完整個核心的但前提是你對作業系統的運作有基本認識否則直接看原始碼會有很高的機率看不懂,挫折感極大
作者:
enthos (影斯作業系統)
2022-08-31 23:18:00作者: breeze08 (linuxer) 2022-08-31 23:19:00
所以建議是先了解作業系統的概念再來看原始碼
作者:
enthos (影斯作業系統)
2022-08-31 23:19:00github.com/gurugio/lowlevelprogramming-university
作者:
TWkobe (中華柯比)
2022-08-31 23:29:00Rtos 算很短易懂了,先看文檔怎麼操作建立task,怎麼註冊int, 再來理解kernel實作
作者:
NerVGear (Phantom)
2022-08-31 23:46:00SourceInsight打開啊如果真要看整個流程去看Bare metal是怎麼init就知道了很多東西都是被toolchain預設的東西藏起來像main function怎麼被call到的這個你就可以研究一陣子了
Task的entry point不就是建立這個task時丟進去的function pointer嗎如果是os的entry point可以試試找start.S之類的應該會有接到c的main
直接從elf反組譯就可以找到第一行程式碼在那裡進入了
作者:
labbat (labbat)
2022-09-01 01:56:00懷疑新手能不能拿到os原始碼,一般不是.a檔包一包就動了能看到的只有介面的交換資料,真正原始碼得找資深同事
作者:
WYchuang (愛賴床的黃金獵犬)
2022-09-01 09:53:00進入點通常是組合語言 往那邊找找看吧
作者: alex70266 (小眼) 2022-09-01 11:24:00
先確認你老闆是要你知道怎麼用,還是要你下手去改。如果是rtos類的通常是從main找到他註冊task function的地方,然後看他怎麼呼叫排程開始然後免不了要看一下每一個task怎麼分配stack空間跟管理,如果你不用牽涉修改os裡面的排程行為應該先知道你手上的版本有什麼功能跟怎麼用就好..如果是要親自去改(比方說porting到另外一個chip)或者需要要細看怎麼做排程跟context switch的話,那就要去看你手邊的code的中斷向量/exception handler怎麼實作context switch(通常在handler中間會看到一段搬動stack的動作跟還原的動作)通常這邊是用組語或者用c的setjump/longjump,怎麼操作就跟你手邊的mcu是什麼版本的arm有關聯,排程的話一定有一個演算法決定下次切換到的task是誰,就是看就好
作者:
neo5277 (I am an agent of chaos)
2022-09-01 12:16:00推推 想寫
回原po,只要你基礎沒打好,就沒有"有效率"的方法.
作者:
lplpkkk (Orzzzzzaaa)
2022-09-01 22:25:00成大資工wiki有freertos教學可以看
作者:
OnlyRD (里巷人)
2022-09-02 15:01:00你需要先有kernel的概念,然後分模組看。
作者: breeze08 (linuxer) 2022-09-01 07:02:00
你的kernel指的是linux kernel還是RTOS?RTOS原始碼量比較少,花些時間是可以看完整個核心的但前提是你對作業系統的運作有基本認識否則直接看原始碼會有很高的機率看不懂,挫折感極大
作者:
enthos (影斯作業系統)
2022-09-01 07:18:00作者: breeze08 (linuxer) 2022-09-01 07:19:00
所以建議是先了解作業系統的概念再來看原始碼
作者:
enthos (影斯作業系統)
2022-09-01 07:19:00github.com/gurugio/lowlevelprogramming-university
作者:
TWkobe (中華柯比)
2022-09-01 07:29:00Rtos 算很短易懂了,先看文檔怎麼操作建立task,怎麼註冊int, 再來理解kernel實作
作者:
NerVGear (Phantom)
2022-09-01 07:46:00SourceInsight打開啊如果真要看整個流程去看Bare metal是怎麼init就知道了很多東西都是被toolchain預設的東西藏起來像main function怎麼被call到的這個你就可以研究一陣子了
Task的entry point不就是建立這個task時丟進去的function pointer嗎如果是os的entry point可以試試找start.S之類的應該會有接到c的main
直接從elf反組譯就可以找到第一行程式碼在那裡進入了
作者:
labbat (labbat)
2022-09-01 09:56:00懷疑新手能不能拿到os原始碼,一般不是.a檔包一包就動了能看到的只有介面的交換資料,真正原始碼得找資深同事
作者:
WYchuang (愛賴床的黃金獵犬)
2022-09-01 17:53:00進入點通常是組合語言 往那邊找找看吧
作者: alex70266 (小眼) 2022-09-01 19:24:00
先確認你老闆是要你知道怎麼用,還是要你下手去改。如果是rtos類的通常是從main找到他註冊task function的地方,然後看他怎麼呼叫排程開始然後免不了要看一下每一個task怎麼分配stack空間跟管理,如果你不用牽涉修改os裡面的排程行為應該先知道你手上的版本有什麼功能跟怎麼用就好..如果是要親自去改(比方說porting到另外一個chip)或者需要要細看怎麼做排程跟context switch的話,那就要去看你手邊的code的中斷向量/exception handler怎麼實作context switch(通常在handler中間會看到一段搬動stack的動作跟還原的動作)通常這邊是用組語或者用c的setjump/longjump,怎麼操作就跟你手邊的mcu是什麼版本的arm有關聯,排程的話一定有一個演算法決定下次切換到的task是誰,就是看就好
作者:
neo5277 (I am an agent of chaos)
2022-09-01 20:16:00推推 想寫
回原po,只要你基礎沒打好,就沒有"有效率"的方法.
作者:
lplpkkk (Orzzzzzaaa)
2022-09-02 06:25:00成大資工wiki有freertos教學可以看
作者:
OnlyRD (里巷人)
2022-09-02 23:01:00你需要先有kernel的概念,然後分模組看。