楼主:
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的概念,然后分模组看。