关于Linux,main的理解
最近在折腾 i.MX6ULL 的内核源码作为一个写惯了单片机的人潜意识里总觉得万物皆有 main。结果今天在源码里全局搜索了一圈竟然一个 main 函数都没发现。起初我还以为是源码没下载全或者是 VS Code 的索引出了问题直到我顺着目录摸到了init/main.c这个文件才发现自己被“常识”给惯坏了。虽然这个文件的名字叫main.c但里面那个真正的入口函数其实叫start_kernel。这种感觉挺奇妙的以前在学校学 C 语言的时候老师总说 main 是唯一的入口等真正到了 Linux 内核这个层级才发现那套规矩其实是给应用层软件定的。对于内核这种直接跑在硬件上的“上帝”来说它完全不需要去凑 main 函数的热闹想起个什么名字全看设计者的心情。不过仔细想想start_kernel确实也算不上第一行执行的代码。在跳转到这个 C 语言函数之前ARM 架构的内核会先去跑arch/arm/kernel/head.S里的那段汇编。那地方才是真正的“无人区”在那儿把 MMU 开启、堆栈设置好才算给后面的 C 语言环境铺好了路。以前玩 STM32 的时候我们往往直接跳过启动文件去看main.c但在 Linux 这里从汇编到start_kernel的这个接力过程反而成了理解底层逻辑最关键的一环。今天这个发现虽然不大但确实让我对内核的视角变了一点。原来所谓的标准也不是一成不变的脱离了应用层的条条框框底层的世界反而更加自由。这种打破常规的感觉可能就是从“调包侠”向底层工程师转变的必经之路吧。