作者ericerix (我的帅,在於脸)
看板Soft_Job
标题[讨论] OS的程式码要怎麽trace比较有效率?
时间Wed Aug 31 22:53:34 2022
大家好,小弟的工作跟 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://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1661957617.A.C2B.html
1F:→ breeze08: 你的kernel指的是linux kernel还是RTOS? 08/31 23:02
RTOS
※ 编辑: ericerix (49.216.55.170 台湾), 08/31/2022 23:04:23
2F:→ breeze08: RTOS原始码量比较少,花些时间是可以看完整个核心的 08/31 23:12
3F:→ breeze08: 但前提是你对作业系统的运作有基本认识 08/31 23:14
4F:→ breeze08: 否则直接看原始码会有很高的机率看不懂,挫折感极大 08/31 23:15
6F:→ breeze08: 所以建议是先了解作业系统的概念再来看原始码 08/31 23:19
7F:→ enthos: github.com/gurugio/lowlevelprogramming-university 08/31 23:19
8F:→ breeze08: 会比较好入手 08/31 23:19
9F:→ breeze08: 如果要快速上手的话,稍微了解一下scheduler跟context 08/31 23:22
10F:→ breeze08: switch的概念,然後就直接看实际范例可能会比较快 08/31 23:22
11F:推 TWkobe: Rtos 算很短易懂了,先看文档怎麽操作建立task,怎麽注册 08/31 23:29
12F:→ TWkobe: int, 再来理解kernel实作 08/31 23:29
13F:推 NerVGear: SourceInsight打开啊 08/31 23:46
14F:推 NerVGear: 如果真要看整个流程去看Bare metal是怎麽init就知道了 08/31 23:49
15F:→ NerVGear: 很多东西都是被toolchain预设的东西藏起来 08/31 23:59
16F:→ NerVGear: 像main function怎麽被call到的这个你就可以研究一阵子 08/31 23:59
17F:→ NerVGear: 了 08/31 23:59
18F:推 henry4343: Task的entry point不就是建立这个task时丢进去的func 09/01 00:12
19F:→ henry4343: tion pointer吗 09/01 00:12
20F:→ henry4343: 如果是os的entry point可以试试找start.S之类的应该会 09/01 00:13
21F:→ henry4343: 有接到c的main 09/01 00:13
22F:推 bena5mail13: 直接从elf反组译就可以找到第一行程式码在那里进入了 09/01 00:21
23F:推 labbat: 怀疑新手能不能拿到os原始码,一般不是.a档包一包就动了 09/01 01:56
24F:→ labbat: 能看到的只有介面的交换资料,真正原始码得找资深同事 09/01 01:57
25F:推 WYchuang: 进入点通常是组合语言 往那边找找看吧 09/01 09:53
26F:推 ihatesmith: RTOS的话可以参考"野火"的RTOS教学pdf 09/01 10:06
27F:推 alex70266: 先确认你老板是要你知道怎麽用,还是要你下手去改。如 09/01 11:24
28F:→ alex70266: 果是rtos类的通常是从main找到他注册task function的地 09/01 11:25
29F:→ alex70266: 方,然後看他怎麽呼叫排程开始 09/01 11:25
30F:推 alex70266: 然後免不了要看一下每一个task怎麽分配stack空间跟管理 09/01 11:30
31F:→ alex70266: ,如果你不用牵涉修改os里面的排程行为应该先知道你手 09/01 11:30
32F:→ alex70266: 上的版本有什麽功能跟怎麽用就好.. 09/01 11:30
33F:→ alex70266: 如果是要亲自去改(比方说porting到另外一个chip)或者 09/01 11:34
34F:→ alex70266: 需要要细看怎麽做排程跟context switch的话,那就要去 09/01 11:34
35F:→ alex70266: 看你手边的code的中断向量/exception handler怎麽实作c 09/01 11:34
36F:→ alex70266: ontext switch(通常在handler中间会看到一段搬动stack 09/01 11:34
37F:→ alex70266: 的动作跟还原的动作)通常这边是用组语或者用c的setjum 09/01 11:34
38F:→ alex70266: p/longjump,怎麽操作就跟你手边的mcu是什麽版本的arm 09/01 11:34
39F:→ alex70266: 有关联,排程的话一定有一个演算法决定下次切换到的tas 09/01 11:34
40F:→ alex70266: k是谁,就是看就好 09/01 11:34
41F:推 neo5277: 推推 想写 09/01 12:16
42F:→ leolarrel: 回原po,只要你基础没打好,就没有"有效率"的方法. 09/01 13:13
43F:推 lplpkkk: 成大资工wiki有freertos教学可以看 09/01 22:25
44F:推 leoloveivy: grep -r无敌 09/02 00:52
45F:推 OnlyRD: 你需要先有kernel的概念,然後分模组看。 09/02 15:01