[討論] OS的程式碼要怎麼trace比較有效率?

看板Soft_Job作者 (我的帥,在於臉)時間3年前 (2022/08/31 22:53), 3年前編輯推噓14(14031)
留言45則, 15人參與, 3年前最新討論串1/1
大家好,小弟的工作跟 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 的經驗,希望有大大能夠給我指引,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.216.55.170 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1661957617.A.C2B.html

08/31 23:02, 3年前 , 1F
你的kernel指的是linux kernel還是RTOS?
08/31 23:02, 1F
RTOS ※ 編輯: ericerix (49.216.55.170 臺灣), 08/31/2022 23:04:23

08/31 23:12, 3年前 , 2F
RTOS原始碼量比較少,花些時間是可以看完整個核心的
08/31 23:12, 2F

08/31 23:14, 3年前 , 3F
但前提是你對作業系統的運作有基本認識
08/31 23:14, 3F

08/31 23:15, 3年前 , 4F
否則直接看原始碼會有很高的機率看不懂,挫折感極大
08/31 23:15, 4F

08/31 23:18, 3年前 , 5F

08/31 23:19, 3年前 , 6F
所以建議是先了解作業系統的概念再來看原始碼
08/31 23:19, 6F

08/31 23:19, 3年前 , 7F
github.com/gurugio/lowlevelprogramming-university
08/31 23:19, 7F

08/31 23:19, 3年前 , 8F
會比較好入手
08/31 23:19, 8F

08/31 23:22, 3年前 , 9F
如果要快速上手的話,稍微了解一下scheduler跟context
08/31 23:22, 9F

08/31 23:22, 3年前 , 10F
switch的概念,然後就直接看實際範例可能會比較快
08/31 23:22, 10F

08/31 23:29, 3年前 , 11F
Rtos 算很短易懂了,先看文檔怎麼操作建立task,怎麼註冊
08/31 23:29, 11F

08/31 23:29, 3年前 , 12F
int, 再來理解kernel實作
08/31 23:29, 12F

08/31 23:46, 3年前 , 13F
SourceInsight打開啊
08/31 23:46, 13F

08/31 23:49, 3年前 , 14F
如果真要看整個流程去看Bare metal是怎麼init就知道了
08/31 23:49, 14F

08/31 23:59, 3年前 , 15F
很多東西都是被toolchain預設的東西藏起來
08/31 23:59, 15F

08/31 23:59, 3年前 , 16F
像main function怎麼被call到的這個你就可以研究一陣子
08/31 23:59, 16F

08/31 23:59, 3年前 , 17F
08/31 23:59, 17F

09/01 00:12, 3年前 , 18F
Task的entry point不就是建立這個task時丟進去的func
09/01 00:12, 18F

09/01 00:12, 3年前 , 19F
tion pointer嗎
09/01 00:12, 19F

09/01 00:13, 3年前 , 20F
如果是os的entry point可以試試找start.S之類的應該會
09/01 00:13, 20F

09/01 00:13, 3年前 , 21F
有接到c的main
09/01 00:13, 21F

09/01 00:21, 3年前 , 22F
直接從elf反組譯就可以找到第一行程式碼在那裡進入了
09/01 00:21, 22F

09/01 01:56, 3年前 , 23F
懷疑新手能不能拿到os原始碼,一般不是.a檔包一包就動了
09/01 01:56, 23F

09/01 01:57, 3年前 , 24F
能看到的只有介面的交換資料,真正原始碼得找資深同事
09/01 01:57, 24F

09/01 09:53, 3年前 , 25F
進入點通常是組合語言 往那邊找找看吧
09/01 09:53, 25F

09/01 10:06, 3年前 , 26F
RTOS的話可以參考"野火"的RTOS教學pdf
09/01 10:06, 26F

09/01 11:24, 3年前 , 27F
先確認你老闆是要你知道怎麼用,還是要你下手去改。如
09/01 11:24, 27F

09/01 11:25, 3年前 , 28F
果是rtos類的通常是從main找到他註冊task function的地
09/01 11:25, 28F

09/01 11:25, 3年前 , 29F
方,然後看他怎麼呼叫排程開始
09/01 11:25, 29F

09/01 11:30, 3年前 , 30F
然後免不了要看一下每一個task怎麼分配stack空間跟管理
09/01 11:30, 30F

09/01 11:30, 3年前 , 31F
,如果你不用牽涉修改os裡面的排程行為應該先知道你手
09/01 11:30, 31F

09/01 11:30, 3年前 , 32F
上的版本有什麼功能跟怎麼用就好..
09/01 11:30, 32F

09/01 11:34, 3年前 , 33F
如果是要親自去改(比方說porting到另外一個chip)或者
09/01 11:34, 33F

09/01 11:34, 3年前 , 34F
需要要細看怎麼做排程跟context switch的話,那就要去
09/01 11:34, 34F

09/01 11:34, 3年前 , 35F
看你手邊的code的中斷向量/exception handler怎麼實作c
09/01 11:34, 35F

09/01 11:34, 3年前 , 36F
ontext switch(通常在handler中間會看到一段搬動stack
09/01 11:34, 36F

09/01 11:34, 3年前 , 37F
的動作跟還原的動作)通常這邊是用組語或者用c的setjum
09/01 11:34, 37F

09/01 11:34, 3年前 , 38F
p/longjump,怎麼操作就跟你手邊的mcu是什麼版本的arm
09/01 11:34, 38F

09/01 11:34, 3年前 , 39F
有關聯,排程的話一定有一個演算法決定下次切換到的tas
09/01 11:34, 39F

09/01 11:34, 3年前 , 40F
k是誰,就是看就好
09/01 11:34, 40F

09/01 12:16, 3年前 , 41F
推推 想寫
09/01 12:16, 41F

09/01 13:13, 3年前 , 42F
回原po,只要你基礎沒打好,就沒有"有效率"的方法.
09/01 13:13, 42F

09/01 22:25, 3年前 , 43F
成大資工wiki有freertos教學可以看
09/01 22:25, 43F

09/02 00:52, 3年前 , 44F
grep -r無敵
09/02 00:52, 44F

09/02 15:01, 3年前 , 45F
你需要先有kernel的概念,然後分模組看。
09/02 15:01, 45F
文章代碼(AID): #1Z3tNnmh (Soft_Job)